From caab632b5d6692a511e323a42687885fbd5412ff Mon Sep 17 00:00:00 2001 From: nojaf Date: Mon, 14 Mar 2022 19:20:16 +0100 Subject: [PATCH 1/7] Introduce ConditionalDirectiveTrivia. --- src/fsharp/CheckDeclarations.fs | 2 +- src/fsharp/ParseAndCheckInputs.fs | 23 +++--- src/fsharp/ParseHelpers.fs | 44 +++++++++- src/fsharp/ParseHelpers.fsi | 10 +++ src/fsharp/ScriptClosure.fs | 4 +- src/fsharp/SyntaxTree.fs | 3 +- src/fsharp/SyntaxTree.fsi | 3 +- src/fsharp/SyntaxTrivia.fs | 16 ++++ src/fsharp/SyntaxTrivia.fsi | 22 ++++- src/fsharp/fsi/fsi.fs | 2 +- src/fsharp/lex.fsl | 7 +- src/fsharp/service/IncrementalBuild.fs | 3 +- src/fsharp/service/ServiceParseTreeWalk.fs | 2 +- ...erService.SurfaceArea.netstandard.expected | 82 ++++++++++++++++++- tests/service/InteractiveCheckerTests.fs | 2 +- tests/service/Symbols.fs | 25 ++++++ 16 files changed, 226 insertions(+), 24 deletions(-) diff --git a/src/fsharp/CheckDeclarations.fs b/src/fsharp/CheckDeclarations.fs index e81a543474f..124bdcfd728 100644 --- a/src/fsharp/CheckDeclarations.fs +++ b/src/fsharp/CheckDeclarations.fs @@ -5959,7 +5959,7 @@ let TypeCheckOneImplFile rootSigOpt: ModuleOrNamespaceType option, synImplFile) = - let (ParsedImplFileInput (_, isScript, qualNameOfFile, scopedPragmas, _, implFileFrags, isLastCompiland)) = synImplFile + let (ParsedImplFileInput (_, isScript, qualNameOfFile, scopedPragmas, _, implFileFrags, isLastCompiland, _)) = synImplFile let infoReader = InfoReader(g, amap) cancellable { diff --git a/src/fsharp/ParseAndCheckInputs.fs b/src/fsharp/ParseAndCheckInputs.fs index b65bb99d614..55b92943c9e 100644 --- a/src/fsharp/ParseAndCheckInputs.fs +++ b/src/fsharp/ParseAndCheckInputs.fs @@ -80,8 +80,8 @@ let PrependPathToSpec x (SynModuleOrNamespaceSig(p, b, c, d, e, f, g, h)) = let PrependPathToInput x inp = match inp with - | ParsedInput.ImplFile (ParsedImplFileInput (b, c, q, d, hd, impls, e)) -> - ParsedInput.ImplFile (ParsedImplFileInput (b, c, PrependPathToQualFileName x q, d, hd, List.map (PrependPathToImpl x) impls, e)) + | ParsedInput.ImplFile (ParsedImplFileInput (b, c, q, d, hd, impls, e, trivia)) -> + ParsedInput.ImplFile (ParsedImplFileInput (b, c, PrependPathToQualFileName x q, d, hd, List.map (PrependPathToImpl x) impls, e, trivia)) | ParsedInput.SigFile (ParsedSigFileInput (b, q, d, hd, specs)) -> ParsedInput.SigFile (ParsedSigFileInput (b, PrependPathToQualFileName x q, d, hd, List.map (PrependPathToSpec x) specs)) @@ -178,7 +178,7 @@ let GetScopedPragmasForHashDirective hd = | Some n -> yield ScopedPragma.WarningOff(m, n) | _ -> () ] -let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImplFile (hashDirectives, impls)) = +let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImplFile (hashDirectives, impls), lexbuf: UnicodeLexing.Lexbuf) = match impls |> List.rev |> List.tryPick (function ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, _, _, _, _, _, _, _)) -> Some lid | _ -> None) with | Some lid when impls.Length > 1 -> errorR(Error(FSComp.SR.buildMultipleToplevelModules(), rangeOfLid lid)) @@ -197,7 +197,9 @@ let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImp for hd in hashDirectives do yield! GetScopedPragmasForHashDirective hd ] - ParsedInput.ImplFile (ParsedImplFileInput (filename, isScript, qualName, scopedPragmas, hashDirectives, impls, isLastCompiland)) + let conditionalDirectives = LexbufIfdefStore.GetTrivia(lexbuf) + + ParsedInput.ImplFile (ParsedImplFileInput (filename, isScript, qualName, scopedPragmas, hashDirectives, impls, isLastCompiland, { ConditionalDirectives = conditionalDirectives })) let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSigFile (hashDirectives, specs)) = match specs |> List.rev |> List.tryPick (function ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, _, _, _, _, _, _, _)) -> Some lid | _ -> None) with @@ -242,9 +244,9 @@ let DeduplicateModuleName (moduleNamesDict: ModuleNamesDict) fileName (qualNameO /// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed. let DeduplicateParsedInputModuleName (moduleNamesDict: ModuleNamesDict) input = match input with - | ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput (fileName, isScript, qualNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) -> + | ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput (fileName, isScript, qualNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe), trivia)) -> let qualNameOfFileT, moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile - let inputT = ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput (fileName, isScript, qualNameOfFileT, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) + let inputT = ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput (fileName, isScript, qualNameOfFileT, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe), trivia)) inputT, moduleNamesDictT | ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput (fileName, qualNameOfFile, scopedPragmas, hashDirectives, modules)) -> let qualNameOfFileT, moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile @@ -279,7 +281,7 @@ let ParseInput (lexer, diagnosticOptions:FSharpDiagnosticOptions, errorLogger: E if FSharpImplFileSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then let impl = Parser.implementationFile lexer lexbuf LexbufLocalXmlDocStore.ReportInvalidXmlDocPositions(lexbuf) - PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, impl) + PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, impl, lexbuf) elif FSharpSigFileSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then let intfs = Parser.signatureFile lexer lexbuf LexbufLocalXmlDocStore.ReportInvalidXmlDocPositions(lexbuf) @@ -355,7 +357,8 @@ let EmptyParsedInput(filename, isLastCompiland) = [], [], [], - isLastCompiland + isLastCompiland, + { ConditionalDirectives = [] } ) ) @@ -649,7 +652,7 @@ let ProcessMetaCommandsFromInput let state = List.fold ProcessMetaCommand state0 hashDirectives let state = List.fold ProcessMetaCommandsFromModuleSpec state specs state - | ParsedInput.ImplFile (ParsedImplFileInput (_, _, _, _, hashDirectives, impls, _)) -> + | ParsedInput.ImplFile (ParsedImplFileInput (hashDirectives = hashDirectives; modules = impls)) -> let state = List.fold ProcessMetaCommand state0 hashDirectives let state = List.fold ProcessMetaCommandsFromModuleImpl state impls state @@ -871,7 +874,7 @@ let TypeCheckOneInput(checkForErrors, return (tcEnv, EmptyTopAttrs, None, ccuSigForFile), tcState - | ParsedInput.ImplFile (ParsedImplFileInput (_, _, qualNameOfFile, _, _, _, _) as file) -> + | ParsedInput.ImplFile (ParsedImplFileInput (qualifiedNameOfFile = qualNameOfFile) as file) -> // Check if we've got an interface for this fragment let rootSigOpt = tcState.tcsRootSigs.TryFind qualNameOfFile diff --git a/src/fsharp/ParseHelpers.fs b/src/fsharp/ParseHelpers.fs index d784e4d73ac..5cc7fe2dcdf 100644 --- a/src/fsharp/ParseHelpers.fs +++ b/src/fsharp/ParseHelpers.fs @@ -6,6 +6,7 @@ open FSharp.Compiler.AbstractIL open FSharp.Compiler.ErrorLogger open FSharp.Compiler.Features open FSharp.Compiler.Syntax +open FSharp.Compiler.SyntaxTrivia open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.UnicodeLexing open FSharp.Compiler.Text @@ -87,7 +88,6 @@ type IParseState with //------------------------------------------------------------------------ /// XmlDoc F# lexer/parser state, held in the BufferLocalStore for the lexer. -/// This is the only use of the lexer BufferLocalStore in the codebase. module LexbufLocalXmlDocStore = // The key into the BufferLocalStore used to hold the current accumulated XmlDoc lines let private xmlDocKey = "XmlDoc" @@ -177,6 +177,48 @@ let rec LexerIfdefEval (lookup: string -> bool) = function | IfdefNot e -> not (LexerIfdefEval lookup e) | IfdefId id -> lookup id +/// Ifdef F# lexer/parser state, held in the BufferLocalStore for the lexer. +/// Used to capture #if, #else and #endif as syntax trivia. +module LexbufIfdefStore = + // The key into the BufferLocalStore used to hold the compiler directives + let private ifDefKey = "Ifdef" + + let private getStore (lexbuf: Lexbuf): ResizeArray = + match lexbuf.BufferLocalStore.TryGetValue ifDefKey with + | true, store -> store + | _ -> + let store = box (ResizeArray()) + lexbuf.BufferLocalStore.[ifDefKey] <- store + store + |> unbox> + + let SaveIfHash (lexbuf: Lexbuf, expr: LexerIfdefExpression, range: range) = + let store = getStore lexbuf + + let expr = + let rec visit (expr: LexerIfdefExpression) : IfDirectiveExpression = + match expr with + | LexerIfdefExpression.IfdefAnd(l,r) -> IfDirectiveExpression.IfdefAnd(visit l, visit r) + | LexerIfdefExpression.IfdefOr(l, r) -> IfDirectiveExpression.IfdefOr(visit l, visit r) + | LexerIfdefExpression.IfdefNot e -> IfDirectiveExpression.IfdefNot(visit e) + | LexerIfdefExpression.IfdefId id -> IfDirectiveExpression.IfdefId id + + visit expr + + store.Add(ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, range)) + + let SaveElseHash (lexbuf: Lexbuf, range: range) = + let store = getStore lexbuf + store.Add(ConditionalDirectiveTrivia.ElseDirectiveTrivia(range)) + + let SaveEndIfHash (lexbuf: Lexbuf, range: range) = + let store = getStore lexbuf + store.Add(ConditionalDirectiveTrivia.EndIfDirectiveTrivia(range)) + + let GetTrivia (lexbuf: Lexbuf): ConditionalDirectiveTrivia list = + let store = getStore lexbuf + Seq.toList store + //------------------------------------------------------------------------ // Parsing: continuations for whitespace tokens //------------------------------------------------------------------------ diff --git a/src/fsharp/ParseHelpers.fsi b/src/fsharp/ParseHelpers.fsi index b97158e4b6f..851b3170f63 100644 --- a/src/fsharp/ParseHelpers.fsi +++ b/src/fsharp/ParseHelpers.fsi @@ -74,6 +74,16 @@ type LexerIfdefExpression = val LexerIfdefEval: lookup:(string -> bool) -> _arg1:LexerIfdefExpression -> bool +module LexbufIfdefStore = + + val SaveIfHash: lexbuf:UnicodeLexing.Lexbuf * expr: LexerIfdefExpression * range: range -> unit + + val SaveElseHash: lexbuf:UnicodeLexing.Lexbuf * range: range -> unit + + val SaveEndIfHash: lexbuf:UnicodeLexing.Lexbuf * range: range -> unit + + val GetTrivia: lexbuf:UnicodeLexing.Lexbuf -> SyntaxTrivia.ConditionalDirectiveTrivia list + [] type LexerStringStyle = | Verbatim diff --git a/src/fsharp/ScriptClosure.fs b/src/fsharp/ScriptClosure.fs index a258b369b87..23b299abf2c 100644 --- a/src/fsharp/ScriptClosure.fs +++ b/src/fsharp/ScriptClosure.fs @@ -355,13 +355,13 @@ module ScriptPreprocessClosure = match List.frontAndBack closureFiles with | rest, ClosureFile (filename, m, - Some(ParsedInput.ImplFile (ParsedImplFileInput (name, isScript, qualNameOfFile, scopedPragmas, hashDirectives, implFileFlags, _))), + Some(ParsedInput.ImplFile (ParsedImplFileInput (name, isScript, qualNameOfFile, scopedPragmas, hashDirectives, implFileFlags, _, trivia))), parseDiagnostics, metaDiagnostics, nowarns) -> let isLastCompiland = (true, tcConfig.target.IsExe) rest @ [ClosureFile (filename, m, - Some(ParsedInput.ImplFile (ParsedImplFileInput (name, isScript, qualNameOfFile, scopedPragmas, hashDirectives, implFileFlags, isLastCompiland))), + Some(ParsedInput.ImplFile (ParsedImplFileInput (name, isScript, qualNameOfFile, scopedPragmas, hashDirectives, implFileFlags, isLastCompiland, trivia))), parseDiagnostics, metaDiagnostics, nowarns)] | _ -> closureFiles diff --git a/src/fsharp/SyntaxTree.fs b/src/fsharp/SyntaxTree.fs index 5f19f5a300f..394bf04557f 100644 --- a/src/fsharp/SyntaxTree.fs +++ b/src/fsharp/SyntaxTree.fs @@ -2014,7 +2014,8 @@ type ParsedImplFileInput = scopedPragmas: ScopedPragma list * hashDirectives: ParsedHashDirective list * modules: SynModuleOrNamespace list * - isLastCompiland: (bool * bool) + isLastCompiland: (bool * bool) * + trivia: ParsedImplFileInputTrivia [] type ParsedSigFileInput = diff --git a/src/fsharp/SyntaxTree.fsi b/src/fsharp/SyntaxTree.fsi index cbd1cd7f790..6d9b87badaf 100644 --- a/src/fsharp/SyntaxTree.fsi +++ b/src/fsharp/SyntaxTree.fsi @@ -2207,7 +2207,8 @@ type ParsedImplFileInput = scopedPragmas: ScopedPragma list * hashDirectives: ParsedHashDirective list * modules: SynModuleOrNamespace list * - isLastCompiland: (bool * bool) + isLastCompiland: (bool * bool) * + trivia: ParsedImplFileInputTrivia /// Represents the full syntax tree, file name and other parsing information for a signature file [] diff --git a/src/fsharp/SyntaxTrivia.fs b/src/fsharp/SyntaxTrivia.fs index be99b40a662..19080717114 100644 --- a/src/fsharp/SyntaxTrivia.fs +++ b/src/fsharp/SyntaxTrivia.fs @@ -4,6 +4,22 @@ namespace FSharp.Compiler.SyntaxTrivia open FSharp.Compiler.Text +[] +type ConditionalDirectiveTrivia = + | IfDirectiveTrivia of expr:IfDirectiveExpression * range:range + | ElseDirectiveTrivia of range:range + | EndIfDirectiveTrivia of range:range + +and IfDirectiveExpression = + | IfdefAnd of IfDirectiveExpression * IfDirectiveExpression + | IfdefOr of IfDirectiveExpression * IfDirectiveExpression + | IfdefNot of IfDirectiveExpression + | IfdefId of string + +[] +type ParsedImplFileInputTrivia = + { ConditionalDirectives: ConditionalDirectiveTrivia list } + [] type SynExprTryWithTrivia = { TryKeyword: range diff --git a/src/fsharp/SyntaxTrivia.fsi b/src/fsharp/SyntaxTrivia.fsi index eab574e1bb2..46d1ce1a4df 100644 --- a/src/fsharp/SyntaxTrivia.fsi +++ b/src/fsharp/SyntaxTrivia.fsi @@ -4,6 +4,26 @@ namespace FSharp.Compiler.SyntaxTrivia open FSharp.Compiler.Text +[] +type ConditionalDirectiveTrivia = + | IfDirectiveTrivia of expr:IfDirectiveExpression * range:range + | ElseDirectiveTrivia of range:range + | EndIfDirectiveTrivia of range:range + +and IfDirectiveExpression = + | IfdefAnd of IfDirectiveExpression * IfDirectiveExpression + | IfdefOr of IfDirectiveExpression * IfDirectiveExpression + | IfdefNot of IfDirectiveExpression + | IfdefId of string + +/// Represents additional information for ParsedImplFileInput +[] +type ParsedImplFileInputTrivia = + { + /// Preprocessor directives of type #if, #else or #endif + ConditionalDirectives: ConditionalDirectiveTrivia list + } + /// Represents additional information for SynExpr.TryWith [] type SynExprTryWithTrivia = @@ -178,4 +198,4 @@ type SynModuleSigDeclNestedModuleTrivia = /// The syntax range of the `=` token. EqualsRange: range option } - static member Zero: SynModuleSigDeclNestedModuleTrivia \ No newline at end of file + static member Zero: SynModuleSigDeclNestedModuleTrivia diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index a13d8083e30..34b76ca4aa1 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -1778,7 +1778,7 @@ type internal FsiDynamicCompiler let impl = SynModuleOrNamespace(prefix,(*isRec*)false, SynModuleOrNamespaceKind.NamedModule,defs,PreXmlDoc.Empty,[],None,m) let isLastCompiland = true let isExe = false - let input = ParsedInput.ImplFile (ParsedImplFileInput (filename,true, ComputeQualifiedNameOfFileFromUniquePath (m,prefixPath),[],[],[impl],(isLastCompiland, isExe) )) + let input = ParsedInput.ImplFile (ParsedImplFileInput (filename,true, ComputeQualifiedNameOfFileFromUniquePath (m,prefixPath),[],[],[impl],(isLastCompiland, isExe), { ConditionalDirectives = [] })) let isIncrementalFragment = true let istate,tcEnvAtEndOfLastInput,declaredImpls = ProcessInputs (ctok, errorLogger, istate, [input], showTypes, isIncrementalFragment, isInteractiveItExpr, prefix, m) let tcState = istate.tcState diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index e98d6a03417..67abb3089ed 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -216,7 +216,7 @@ let evalIfDefExpression startPos reportLibraryOnlyFeatures langVersion args (loo lexbuf.EndPos <- startPos let tokenStream = FSharp.Compiler.PPLexer.tokenstream args let expr = FSharp.Compiler.PPParser.start tokenStream lexbuf - LexerIfdefEval lookup expr + (LexerIfdefEval lookup expr), expr let evalFloat args lexbuf = try @@ -943,8 +943,9 @@ rule token args skip = parse { let m = lexbuf.LexemeRange let lookup id = List.contains id args.defines let lexed = lexeme lexbuf - let isTrue = evalIfDefExpression lexbuf.StartPos lexbuf.ReportLibraryOnlyFeatures lexbuf.LanguageVersion args lookup lexed + let isTrue, expr = evalIfDefExpression lexbuf.StartPos lexbuf.ReportLibraryOnlyFeatures lexbuf.LanguageVersion args lookup lexed args.ifdefStack <- (IfDefIf,m) :: args.ifdefStack + LexbufIfdefStore.SaveIfHash(lexbuf, expr, m) // Get the token; make sure it starts at zero position & return let cont, f = @@ -968,6 +969,7 @@ rule token args skip = parse | (IfDefIf,_) :: rest -> let m = lexbuf.LexemeRange args.ifdefStack <- (IfDefElse,m) :: rest + LexbufIfdefStore.SaveElseHash(lexbuf, m) let tok = HASH_ELSE(m, lexed, LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(0, m))) let tok = shouldStartLine args lexbuf m (FSComp.SR.lexHashElseMustBeFirst()) tok if not skip then tok else endline (LexerEndlineContinuation.Skip(0, m)) args skip lexbuf } @@ -979,6 +981,7 @@ rule token args skip = parse | []-> LEX_FAILURE (FSComp.SR.lexHashEndingNoMatchingIf()) | _ :: rest -> args.ifdefStack <- rest + LexbufIfdefStore.SaveEndIfHash(lexbuf, m) let tok = HASH_ENDIF(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) let tok = shouldStartLine args lexbuf m (FSComp.SR.lexHashEndifMustBeFirst()) tok if not skip then tok else endline LexerEndlineContinuation.Token args skip lexbuf } diff --git a/src/fsharp/service/IncrementalBuild.fs b/src/fsharp/service/IncrementalBuild.fs index f10aa68bf8a..f8c5581dad8 100644 --- a/src/fsharp/service/IncrementalBuild.fs +++ b/src/fsharp/service/IncrementalBuild.fs @@ -120,7 +120,8 @@ module IncrementalBuildSyntaxTree = [], [], [], - isLastCompiland + isLastCompiland, + { ConditionalDirectives = [] } ) ) else diff --git a/src/fsharp/service/ServiceParseTreeWalk.fs b/src/fsharp/service/ServiceParseTreeWalk.fs index e0486c120a0..8d7369e62b2 100755 --- a/src/fsharp/service/ServiceParseTreeWalk.fs +++ b/src/fsharp/service/ServiceParseTreeWalk.fs @@ -808,7 +808,7 @@ module SyntaxTraversal = visitor.VisitBinding(origPath, defaultTraverse,b) match parseTree with - | ParsedInput.ImplFile (ParsedImplFileInput (_,_,_,_,_,l,_))-> + | ParsedInput.ImplFile (ParsedImplFileInput (modules = l))-> let fileRange = #if DEBUG match l with [] -> range0 | _ -> l |> List.map (fun x -> x.Range) |> List.reduce unionRanges diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index 6384964188c..3083ecbf86c 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -5505,9 +5505,11 @@ FSharp.Compiler.Syntax.ParsedImplFileFragment: System.String ToString() FSharp.Compiler.Syntax.ParsedImplFileInput FSharp.Compiler.Syntax.ParsedImplFileInput: Boolean get_isScript() FSharp.Compiler.Syntax.ParsedImplFileInput: Boolean isScript -FSharp.Compiler.Syntax.ParsedImplFileInput: FSharp.Compiler.Syntax.ParsedImplFileInput NewParsedImplFileInput(System.String, Boolean, FSharp.Compiler.Syntax.QualifiedNameOfFile, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.ScopedPragma], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.ParsedHashDirective], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleOrNamespace], System.Tuple`2[System.Boolean,System.Boolean]) +FSharp.Compiler.Syntax.ParsedImplFileInput: FSharp.Compiler.Syntax.ParsedImplFileInput NewParsedImplFileInput(System.String, Boolean, FSharp.Compiler.Syntax.QualifiedNameOfFile, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.ScopedPragma], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.ParsedHashDirective], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleOrNamespace], System.Tuple`2[System.Boolean,System.Boolean], FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia) FSharp.Compiler.Syntax.ParsedImplFileInput: FSharp.Compiler.Syntax.QualifiedNameOfFile get_qualifiedNameOfFile() FSharp.Compiler.Syntax.ParsedImplFileInput: FSharp.Compiler.Syntax.QualifiedNameOfFile qualifiedNameOfFile +FSharp.Compiler.Syntax.ParsedImplFileInput: FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia get_trivia() +FSharp.Compiler.Syntax.ParsedImplFileInput: FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia trivia FSharp.Compiler.Syntax.ParsedImplFileInput: Int32 Tag FSharp.Compiler.Syntax.ParsedImplFileInput: Int32 get_Tag() FSharp.Compiler.Syntax.ParsedImplFileInput: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.ParsedHashDirective] get_hashDirectives() @@ -9085,6 +9087,84 @@ FSharp.Compiler.Syntax.TyparStaticReq: Int32 GetHashCode(System.Collections.IEqu FSharp.Compiler.Syntax.TyparStaticReq: Int32 Tag FSharp.Compiler.Syntax.TyparStaticReq: Int32 get_Tag() FSharp.Compiler.Syntax.TyparStaticReq: System.String ToString() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+ElseDirectiveTrivia: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+ElseDirectiveTrivia: FSharp.Compiler.Text.Range range +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+EndIfDirectiveTrivia: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+EndIfDirectiveTrivia: FSharp.Compiler.Text.Range range +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+IfDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression expr +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+IfDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_expr() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+IfDirectiveTrivia: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+IfDirectiveTrivia: FSharp.Compiler.Text.Range range +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags: Int32 ElseDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags: Int32 EndIfDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags: Int32 IfDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean IsElseDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean IsEndIfDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean IsIfDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean get_IsElseDirectiveTrivia() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean get_IsEndIfDirectiveTrivia() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean get_IsIfDirectiveTrivia() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia NewElseDirectiveTrivia(FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia NewEndIfDirectiveTrivia(FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia NewIfDirectiveTrivia(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression, FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+ElseDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+EndIfDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+IfDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Int32 Tag +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Int32 get_Tag() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefAnd: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item1 +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefAnd: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item2 +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefAnd: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item1() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefAnd: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item2() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefId: System.String Item +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefId: System.String get_Item() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefNot: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefNot: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item1 +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item2 +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item1() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item2() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefAnd +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefId +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefNot +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefOr +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean Equals(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean Equals(System.Object) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean Equals(System.Object, System.Collections.IEqualityComparer) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefAnd +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefId +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefNot +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefOr +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsIfdefAnd() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsIfdefId() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsIfdefNot() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsIfdefOr() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewIfdefAnd(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression, FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewIfdefId(System.String) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewIfdefNot(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewIfdefOr(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression, FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefAnd +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefId +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefNot +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 CompareTo(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 CompareTo(System.Object) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 CompareTo(System.Object, System.Collections.IComparer) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 GetHashCode() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 GetHashCode(System.Collections.IEqualityComparer) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 Tag +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 get_Tag() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: System.String ToString() +FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia +FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia] ConditionalDirectives +FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia] get_ConditionalDirectives() +FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia: Void .ctor(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia]) FSharp.Compiler.SyntaxTrivia.SynBindingTrivia FSharp.Compiler.SyntaxTrivia.SynBindingTrivia: FSharp.Compiler.SyntaxTrivia.SynBindingTrivia Zero FSharp.Compiler.SyntaxTrivia.SynBindingTrivia: FSharp.Compiler.SyntaxTrivia.SynBindingTrivia get_Zero() diff --git a/tests/service/InteractiveCheckerTests.fs b/tests/service/InteractiveCheckerTests.fs index 12d80181986..b784b487bad 100644 --- a/tests/service/InteractiveCheckerTests.fs +++ b/tests/service/InteractiveCheckerTests.fs @@ -54,7 +54,7 @@ let internal identsAndRanges (input: ParsedInput) = (identAndRange (longIdentToString longIdent) (longIdent |> List.map (fun id -> id.idRange) |> List.reduce unionRanges)) :: xs match input with - | ParsedInput.ImplFile(ParsedImplFileInput(_, _, _, _, _, modulesOrNamespaces, _)) -> + | ParsedInput.ImplFile(ParsedImplFileInput(modules = modulesOrNamespaces)) -> modulesOrNamespaces |> List.collect extractFromModuleOrNamespace | ParsedInput.SigFile _ -> [] diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index 20ba3ca4612..f1dbf422cf1 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -11,6 +11,7 @@ open System open FSharp.Compiler.Service.Tests.Common open FSharp.Compiler.Symbols open FSharp.Compiler.Syntax +open FSharp.Compiler.SyntaxTrivia open FsUnit open NUnit.Framework @@ -3301,3 +3302,27 @@ async { assertRange (5, 4) (5, 24) mAndBang2 | _ -> Assert.Fail "Could not get valid AST" + +module ConditionalDirectives = + [] + let ``single #if / #endif`` () = + let ast = + getParseResults """ +let v = + #if DEBUG + () + #endif + 42 +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(trivia = { ConditionalDirectives = [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] })) -> + assertRange (3, 0) (3, 13) mIf + assertRange (5, 0) (5, 10) mEndif + + match expr with + | IfDirectiveExpression.IfdefId "DEBUG" -> () + | _ -> Assert.Fail $"Expected different expression, got {expr}" + | _ -> + Assert.Fail "Could not get valid AST" \ No newline at end of file From 604d606c9c76a0968862a690502a23851051e72d Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 16 Mar 2022 18:16:02 +0100 Subject: [PATCH 2/7] Store correct start column of directive. --- src/fsharp/ParseHelpers.fs | 20 ++++++++++++++------ src/fsharp/ParseHelpers.fsi | 6 +++--- src/fsharp/lex.fsl | 7 ++++--- tests/service/Symbols.fs | 30 ++++++++++++++++++++++++++++-- 4 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/fsharp/ParseHelpers.fs b/src/fsharp/ParseHelpers.fs index 5cc7fe2dcdf..f261f98812d 100644 --- a/src/fsharp/ParseHelpers.fs +++ b/src/fsharp/ParseHelpers.fs @@ -192,7 +192,11 @@ module LexbufIfdefStore = store |> unbox> - let SaveIfHash (lexbuf: Lexbuf, expr: LexerIfdefExpression, range: range) = + let private mkRangeWithoutLeadingWhitespace (lexed:string) (m:range): range = + let startColumn = lexed.Length - lexed.TrimStart().Length + mkFileIndexRange m.FileIndex (mkPos m.StartLine startColumn) m.End + + let SaveIfHash (lexbuf: Lexbuf, lexed:string, expr: LexerIfdefExpression, range: range) = let store = getStore lexbuf let expr = @@ -205,15 +209,19 @@ module LexbufIfdefStore = visit expr - store.Add(ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, range)) + let m = mkRangeWithoutLeadingWhitespace lexed range + + store.Add(ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, m)) - let SaveElseHash (lexbuf: Lexbuf, range: range) = + let SaveElseHash (lexbuf: Lexbuf, lexed:string, range: range) = let store = getStore lexbuf - store.Add(ConditionalDirectiveTrivia.ElseDirectiveTrivia(range)) + let m = mkRangeWithoutLeadingWhitespace lexed range + store.Add(ConditionalDirectiveTrivia.ElseDirectiveTrivia(m)) - let SaveEndIfHash (lexbuf: Lexbuf, range: range) = + let SaveEndIfHash (lexbuf: Lexbuf, lexed:string, range: range) = let store = getStore lexbuf - store.Add(ConditionalDirectiveTrivia.EndIfDirectiveTrivia(range)) + let m = mkRangeWithoutLeadingWhitespace lexed range + store.Add(ConditionalDirectiveTrivia.EndIfDirectiveTrivia(m)) let GetTrivia (lexbuf: Lexbuf): ConditionalDirectiveTrivia list = let store = getStore lexbuf diff --git a/src/fsharp/ParseHelpers.fsi b/src/fsharp/ParseHelpers.fsi index 851b3170f63..69c30215365 100644 --- a/src/fsharp/ParseHelpers.fsi +++ b/src/fsharp/ParseHelpers.fsi @@ -76,11 +76,11 @@ val LexerIfdefEval: lookup:(string -> bool) -> _arg1:LexerIfdefExpression -> boo module LexbufIfdefStore = - val SaveIfHash: lexbuf:UnicodeLexing.Lexbuf * expr: LexerIfdefExpression * range: range -> unit + val SaveIfHash: lexbuf:UnicodeLexing.Lexbuf * lexed:string * expr: LexerIfdefExpression * range: range -> unit - val SaveElseHash: lexbuf:UnicodeLexing.Lexbuf * range: range -> unit + val SaveElseHash: lexbuf:UnicodeLexing.Lexbuf * lexed:string * range: range -> unit - val SaveEndIfHash: lexbuf:UnicodeLexing.Lexbuf * range: range -> unit + val SaveEndIfHash: lexbuf:UnicodeLexing.Lexbuf * lexed:string * range: range -> unit val GetTrivia: lexbuf:UnicodeLexing.Lexbuf -> SyntaxTrivia.ConditionalDirectiveTrivia list diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index 67abb3089ed..f5ffdbbdc7e 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -945,7 +945,7 @@ rule token args skip = parse let lexed = lexeme lexbuf let isTrue, expr = evalIfDefExpression lexbuf.StartPos lexbuf.ReportLibraryOnlyFeatures lexbuf.LanguageVersion args lookup lexed args.ifdefStack <- (IfDefIf,m) :: args.ifdefStack - LexbufIfdefStore.SaveIfHash(lexbuf, expr, m) + LexbufIfdefStore.SaveIfHash(lexbuf, lexed, expr, m) // Get the token; make sure it starts at zero position & return let cont, f = @@ -969,7 +969,7 @@ rule token args skip = parse | (IfDefIf,_) :: rest -> let m = lexbuf.LexemeRange args.ifdefStack <- (IfDefElse,m) :: rest - LexbufIfdefStore.SaveElseHash(lexbuf, m) + LexbufIfdefStore.SaveElseHash(lexbuf, lexed, m) let tok = HASH_ELSE(m, lexed, LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(0, m))) let tok = shouldStartLine args lexbuf m (FSComp.SR.lexHashElseMustBeFirst()) tok if not skip then tok else endline (LexerEndlineContinuation.Skip(0, m)) args skip lexbuf } @@ -981,7 +981,7 @@ rule token args skip = parse | []-> LEX_FAILURE (FSComp.SR.lexHashEndingNoMatchingIf()) | _ :: rest -> args.ifdefStack <- rest - LexbufIfdefStore.SaveEndIfHash(lexbuf, m) + LexbufIfdefStore.SaveEndIfHash(lexbuf, lexed, m) let tok = HASH_ENDIF(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) let tok = shouldStartLine args lexbuf m (FSComp.SR.lexHashEndifMustBeFirst()) tok if not skip then tok else endline LexerEndlineContinuation.Token args skip lexbuf } @@ -1054,6 +1054,7 @@ and ifdefSkip n m args skip = parse match args.ifdefStack with | [] -> LEX_FAILURE (FSComp.SR.lexHashEndingNoMatchingIf()) | _ :: rest -> + LexbufIfdefStore.SaveEndIfHash(lexbuf, lexed, m) args.ifdefStack <- rest if not skip then HASH_ENDIF(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) else endline LexerEndlineContinuation.Token args skip lexbuf diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index f1dbf422cf1..9981bc7a696 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -3318,8 +3318,34 @@ let v = match ast with | ParsedInput.ImplFile(ParsedImplFileInput(trivia = { ConditionalDirectives = [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] })) -> - assertRange (3, 0) (3, 13) mIf - assertRange (5, 0) (5, 10) mEndif + assertRange (3, 4) (3, 13) mIf + assertRange (5, 4) (5, 10) mEndif + + match expr with + | IfDirectiveExpression.IfdefId "DEBUG" -> () + | _ -> Assert.Fail $"Expected different expression, got {expr}" + | _ -> + Assert.Fail "Could not get valid AST" + + [] + let ``single #if / #else / #endif`` () = + let ast = + getParseResults """ +let v = + #if DEBUG + 30 + #else + 42 + #endif +""" + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(trivia = { ConditionalDirectives = [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) + ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] })) -> + assertRange (3, 4) (3, 13) mIf + assertRange (5, 4) (5, 9) mElse + assertRange (7, 4) (7, 10) mEndif match expr with | IfDirectiveExpression.IfdefId "DEBUG" -> () From f22b5d8951da10a2630021fda381be8012139773 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 16 Mar 2022 18:19:49 +0100 Subject: [PATCH 3/7] Add RequireQualifiedAccess to IfDirectiveExpression. --- src/fsharp/SyntaxTrivia.fs | 2 +- src/fsharp/SyntaxTrivia.fsi | 2 +- ...Sharp.CompilerService.SurfaceArea.netstandard.expected | 8 -------- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/fsharp/SyntaxTrivia.fs b/src/fsharp/SyntaxTrivia.fs index 19080717114..9ea4855532a 100644 --- a/src/fsharp/SyntaxTrivia.fs +++ b/src/fsharp/SyntaxTrivia.fs @@ -10,7 +10,7 @@ type ConditionalDirectiveTrivia = | ElseDirectiveTrivia of range:range | EndIfDirectiveTrivia of range:range -and IfDirectiveExpression = +and [] IfDirectiveExpression = | IfdefAnd of IfDirectiveExpression * IfDirectiveExpression | IfdefOr of IfDirectiveExpression * IfDirectiveExpression | IfdefNot of IfDirectiveExpression diff --git a/src/fsharp/SyntaxTrivia.fsi b/src/fsharp/SyntaxTrivia.fsi index 46d1ce1a4df..06ad48bf2be 100644 --- a/src/fsharp/SyntaxTrivia.fsi +++ b/src/fsharp/SyntaxTrivia.fsi @@ -10,7 +10,7 @@ type ConditionalDirectiveTrivia = | ElseDirectiveTrivia of range:range | EndIfDirectiveTrivia of range:range -and IfDirectiveExpression = +and [] IfDirectiveExpression = | IfdefAnd of IfDirectiveExpression * IfDirectiveExpression | IfdefOr of IfDirectiveExpression * IfDirectiveExpression | IfdefNot of IfDirectiveExpression diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index 3083ecbf86c..43bbdfd2d49 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -9132,9 +9132,6 @@ FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefAnd FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefId FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefNot FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefOr -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean Equals(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean Equals(System.Object) -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean Equals(System.Object, System.Collections.IEqualityComparer) FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefAnd FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefId FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefNot @@ -9152,11 +9149,6 @@ FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefNot FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 CompareTo(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 CompareTo(System.Object) -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 CompareTo(System.Object, System.Collections.IComparer) -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 GetHashCode() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 GetHashCode(System.Collections.IEqualityComparer) FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 Tag FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 get_Tag() FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: System.String ToString() From 023ed9a103e2d862d85ea6f549550cadfc6f7d5a Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 16 Mar 2022 18:50:21 +0100 Subject: [PATCH 4/7] Verify nested scenarios and complex expressions. --- src/fsharp/lex.fsl | 7 +++ tests/service/Symbols.fs | 114 ++++++++++++++++++++++++++++++++++----- 2 files changed, 108 insertions(+), 13 deletions(-) diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index f5ffdbbdc7e..ee51a268cc1 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -1018,6 +1018,10 @@ and ifdefSkip n m args skip = parse if not skip then INACTIVECODE (LexCont.IfDefSkip(args.ifdefStack, args.stringNest, n, m)) else ifdefSkip n m args skip lexbuf else + let lexed = lexeme lexbuf + let lookup id = List.contains id args.defines + let _, expr = evalIfDefExpression lexbuf.StartPos lexbuf.ReportLibraryOnlyFeatures lexbuf.LanguageVersion args lookup lexed + LexbufIfdefStore.SaveIfHash(lexbuf, lexed, expr, m) let tok = INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(n+1, m))) if not skip then tok else endline (LexerEndlineContinuation.Skip(n+1, m)) args skip lexbuf } @@ -1035,10 +1039,12 @@ and ifdefSkip n m args skip = parse | (IfDefElse,_) :: _rest -> LEX_FAILURE (FSComp.SR.lexHashEndifRequiredForElse()) | (IfDefIf,_) :: rest -> let m = lexbuf.LexemeRange + LexbufIfdefStore.SaveElseHash(lexbuf, lexed, m) args.ifdefStack <- (IfDefElse,m) :: rest if not skip then HASH_ELSE(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) else endline LexerEndlineContinuation.Token args skip lexbuf else + LexbufIfdefStore.SaveElseHash(lexbuf, lexed, m) if not skip then INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(n, m))) else endline (LexerEndlineContinuation.Skip(n, m)) args skip lexbuf } @@ -1059,6 +1065,7 @@ and ifdefSkip n m args skip = parse if not skip then HASH_ENDIF(m,lexed,LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Token)) else endline LexerEndlineContinuation.Token args skip lexbuf else + LexbufIfdefStore.SaveEndIfHash(lexbuf, lexed, m) let tok = INACTIVECODE(LexCont.EndLine(args.ifdefStack, args.stringNest, LexerEndlineContinuation.Skip(n-1, m))) let tok = shouldStartLine args lexbuf m (FSComp.SR.lexWrongNestedHashEndif()) tok if not skip then tok else endline (LexerEndlineContinuation.Skip(n-1, m)) args skip lexbuf } diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index 9981bc7a696..b2ca4097cc2 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -3304,10 +3304,16 @@ async { Assert.Fail "Could not get valid AST" module ConditionalDirectives = + let private getDirectiveTrivia source = + let ast = getParseResults source + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(trivia = { ConditionalDirectives = trivia })) -> trivia + | ParsedInput.SigFile _ -> [] + [] let ``single #if / #endif`` () = - let ast = - getParseResults """ + let trivia = + getDirectiveTrivia """ let v = #if DEBUG () @@ -3315,9 +3321,9 @@ let v = 42 """ - match ast with - | ParsedInput.ImplFile(ParsedImplFileInput(trivia = { ConditionalDirectives = [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] })) -> + match trivia with + | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] -> assertRange (3, 4) (3, 13) mIf assertRange (5, 4) (5, 10) mEndif @@ -3325,12 +3331,12 @@ let v = | IfDirectiveExpression.IfdefId "DEBUG" -> () | _ -> Assert.Fail $"Expected different expression, got {expr}" | _ -> - Assert.Fail "Could not get valid AST" + Assert.Fail $"Unexpected trivia, got {trivia}" [] let ``single #if / #else / #endif`` () = - let ast = - getParseResults """ + let trivia = + getDirectiveTrivia """ let v = #if DEBUG 30 @@ -3339,10 +3345,10 @@ let v = #endif """ - match ast with - | ParsedInput.ImplFile(ParsedImplFileInput(trivia = { ConditionalDirectives = [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) - ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] })) -> + match trivia with + | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) + ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] -> assertRange (3, 4) (3, 13) mIf assertRange (5, 4) (5, 9) mElse assertRange (7, 4) (7, 10) mEndif @@ -3351,4 +3357,86 @@ let v = | IfDirectiveExpression.IfdefId "DEBUG" -> () | _ -> Assert.Fail $"Expected different expression, got {expr}" | _ -> - Assert.Fail "Could not get valid AST" \ No newline at end of file + Assert.Fail $"Unexpected trivia, got {trivia}" + + [] + let ``nested #if / #else / #endif`` () = + let trivia = + getDirectiveTrivia """ +let v = + #if FOO + #if MEH + 1 + #else + 2 + #endif + #else + 3 + #endif +""" + + match trivia with + | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr1, mIf1) + ConditionalDirectiveTrivia.IfDirectiveTrivia(expr2, mIf2) + ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse1 + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif1 + ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse2 + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif2 ] -> + assertRange (3, 4) (3, 11) mIf1 + assertRange (4, 8) (4, 15) mIf2 + assertRange (6, 8) (6, 13) mElse1 + assertRange (8, 8) (8, 14) mEndif1 + assertRange (9, 4) (9, 9) mElse2 + assertRange (11, 4) (11, 10) mEndif2 + + match expr1 with + | IfDirectiveExpression.IfdefId "FOO" -> () + | _ -> Assert.Fail $"Expected different expression, got {expr1}" + + match expr2 with + | IfDirectiveExpression.IfdefId "MEH" -> () + | _ -> Assert.Fail $"Expected different expression, got {expr2}" + | _ -> + Assert.Fail $"Unexpected trivia, got {trivia}" + + [] + let ``nested #if / ##endif with complex expressions`` () = + let trivia = + getDirectiveTrivia """ +let v = + #if !DEBUG + #if FOO && BAR + #if MEH || HMM + printfn "oh some logging" + #endif + #endif + #endif +""" + + match trivia with + | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr1, mIf1) + ConditionalDirectiveTrivia.IfDirectiveTrivia(expr2, mIf2) + ConditionalDirectiveTrivia.IfDirectiveTrivia(expr3, mIf3) + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif1 + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif2 + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif3 ] -> + assertRange (3, 4) (3, 14) mIf1 + assertRange (4, 8) (4, 22) mIf2 + assertRange (5, 12) (5, 26) mIf3 + assertRange (7, 12) (7, 18) mEndif1 + assertRange (8, 8) (8, 14) mEndif2 + assertRange (9, 4) (9, 10) mEndif3 + + match expr1 with + | IfDirectiveExpression.IfdefNot (IfDirectiveExpression.IfdefId "DEBUG") -> () + | _ -> Assert.Fail $"Expected different expression, got {expr1}" + + match expr2 with + | IfDirectiveExpression.IfdefAnd(IfDirectiveExpression.IfdefId "FOO", IfDirectiveExpression.IfdefId "BAR") -> () + | _ -> Assert.Fail $"Expected different expression, got {expr2}" + + match expr3 with + | IfDirectiveExpression.IfdefOr(IfDirectiveExpression.IfdefId "MEH", IfDirectiveExpression.IfdefId "HMM") -> () + | _ -> Assert.Fail $"Expected different expression, got {expr3}" + | _ -> + Assert.Fail $"Unexpected trivia, got {trivia}" \ No newline at end of file From 57bbc1152617d76a305a3c8c755b8f66764d83e5 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 16 Mar 2022 18:53:15 +0100 Subject: [PATCH 5/7] Add tests for multiline comments and strings. --- tests/service/Symbols.fs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index b2ca4097cc2..0003091cf3d 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -3438,5 +3438,40 @@ let v = match expr3 with | IfDirectiveExpression.IfdefOr(IfDirectiveExpression.IfdefId "MEH", IfDirectiveExpression.IfdefId "HMM") -> () | _ -> Assert.Fail $"Expected different expression, got {expr3}" + | _ -> + Assert.Fail $"Unexpected trivia, got {trivia}" + + [] + let ``directives in multiline comment are not reported as trivia`` () = + let trivia = + getDirectiveTrivia """ +let v = +(* + #if DEBUG + () + #endif +*) + 42 +""" + + match trivia with + | [] -> Assert.Pass() + | _ -> + Assert.Fail $"Unexpected trivia, got {trivia}" + + [] + let ``directives in multiline string are not reported as trivia`` () = + let trivia = + getDirectiveTrivia " +let v = \"\"\" + #if DEBUG + () + #endif + 42 +\"\"\" +" + + match trivia with + | [] -> Assert.Pass() | _ -> Assert.Fail $"Unexpected trivia, got {trivia}" \ No newline at end of file From d5906bfd9ec6b4e207a65666529b6eefdbead889 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 16 Mar 2022 20:27:31 +0100 Subject: [PATCH 6/7] Add trivia for ParsedSigFileInput. --- src/fsharp/CheckDeclarations.fs | 2 +- src/fsharp/ParseAndCheckInputs.fs | 25 ++- src/fsharp/SyntaxTree.fs | 3 +- src/fsharp/SyntaxTree.fsi | 3 +- src/fsharp/SyntaxTrivia.fs | 4 + src/fsharp/SyntaxTrivia.fsi | 8 + src/fsharp/service/ServiceNavigation.fs | 2 +- ...erService.SurfaceArea.netstandard.expected | 9 +- tests/service/Symbols.fs | 203 ++++++++++++++++-- 9 files changed, 231 insertions(+), 28 deletions(-) diff --git a/src/fsharp/CheckDeclarations.fs b/src/fsharp/CheckDeclarations.fs index 124bdcfd728..7378c62a142 100644 --- a/src/fsharp/CheckDeclarations.fs +++ b/src/fsharp/CheckDeclarations.fs @@ -6080,7 +6080,7 @@ let TypeCheckOneImplFile /// Check an entire signature file -let TypeCheckOneSigFile (g, niceNameGen, amap, topCcu, checkForErrors, conditionalDefines, tcSink, isInternalTestSpanStackReferring) tcEnv (ParsedSigFileInput (_, qualNameOfFile, _, _, sigFileFrags)) = +let TypeCheckOneSigFile (g, niceNameGen, amap, topCcu, checkForErrors, conditionalDefines, tcSink, isInternalTestSpanStackReferring) tcEnv (ParsedSigFileInput (qualifiedNameOfFile = qualNameOfFile; modules = sigFileFrags)) = cancellable { let cenv = cenv.Create diff --git a/src/fsharp/ParseAndCheckInputs.fs b/src/fsharp/ParseAndCheckInputs.fs index 55b92943c9e..d0513ed3b72 100644 --- a/src/fsharp/ParseAndCheckInputs.fs +++ b/src/fsharp/ParseAndCheckInputs.fs @@ -83,8 +83,8 @@ let PrependPathToInput x inp = | ParsedInput.ImplFile (ParsedImplFileInput (b, c, q, d, hd, impls, e, trivia)) -> ParsedInput.ImplFile (ParsedImplFileInput (b, c, PrependPathToQualFileName x q, d, hd, List.map (PrependPathToImpl x) impls, e, trivia)) - | ParsedInput.SigFile (ParsedSigFileInput (b, q, d, hd, specs)) -> - ParsedInput.SigFile (ParsedSigFileInput (b, PrependPathToQualFileName x q, d, hd, List.map (PrependPathToSpec x) specs)) + | ParsedInput.SigFile (ParsedSigFileInput (b, q, d, hd, specs, trivia)) -> + ParsedInput.SigFile (ParsedSigFileInput (b, PrependPathToQualFileName x q, d, hd, List.map (PrependPathToSpec x) specs, trivia)) let ComputeAnonModuleName check defaultNamespace filename (m: range) = let modname = CanonicalizeFilename filename @@ -201,7 +201,7 @@ let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImp ParsedInput.ImplFile (ParsedImplFileInput (filename, isScript, qualName, scopedPragmas, hashDirectives, impls, isLastCompiland, { ConditionalDirectives = conditionalDirectives })) -let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSigFile (hashDirectives, specs)) = +let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSigFile (hashDirectives, specs), lexbuf: UnicodeLexing.Lexbuf) = match specs |> List.rev |> List.tryPick (function ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, _, _, _, _, _, _, _)) -> Some lid | _ -> None) with | Some lid when specs.Length > 1 -> errorR(Error(FSComp.SR.buildMultipleToplevelModules(), rangeOfLid lid)) @@ -219,7 +219,9 @@ let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSig for hd in hashDirectives do yield! GetScopedPragmasForHashDirective hd ] - ParsedInput.SigFile (ParsedSigFileInput (filename, qualName, scopedPragmas, hashDirectives, specs)) + let conditionalDirectives = LexbufIfdefStore.GetTrivia(lexbuf) + + ParsedInput.SigFile (ParsedSigFileInput (filename, qualName, scopedPragmas, hashDirectives, specs, { ConditionalDirectives = conditionalDirectives })) type ModuleNamesDict = Map> @@ -248,9 +250,9 @@ let DeduplicateParsedInputModuleName (moduleNamesDict: ModuleNamesDict) input = let qualNameOfFileT, moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile let inputT = ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput (fileName, isScript, qualNameOfFileT, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe), trivia)) inputT, moduleNamesDictT - | ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput (fileName, qualNameOfFile, scopedPragmas, hashDirectives, modules)) -> + | ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput (fileName, qualNameOfFile, scopedPragmas, hashDirectives, modules, trivia)) -> let qualNameOfFileT, moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile - let inputT = ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput (fileName, qualNameOfFileT, scopedPragmas, hashDirectives, modules)) + let inputT = ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput (fileName, qualNameOfFileT, scopedPragmas, hashDirectives, modules, trivia)) inputT, moduleNamesDictT let ParseInput (lexer, diagnosticOptions:FSharpDiagnosticOptions, errorLogger: ErrorLogger, lexbuf: UnicodeLexing.Lexbuf, defaultNamespace, filename, isLastCompiland) = @@ -285,7 +287,7 @@ let ParseInput (lexer, diagnosticOptions:FSharpDiagnosticOptions, errorLogger: E elif FSharpSigFileSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then let intfs = Parser.signatureFile lexer lexbuf LexbufLocalXmlDocStore.ReportInvalidXmlDocPositions(lexbuf) - PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, intfs) + PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, intfs, lexbuf) else if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then error(Error(FSComp.SR.buildInvalidSourceFileExtensionUpdated filename, rangeStartup)) @@ -331,7 +333,7 @@ let ReportParsingStatistics res = let flattenModSpec (SynModuleOrNamespaceSig(_, _, _, decls, _, _, _, _)) = flattenSpecs decls let flattenModImpl (SynModuleOrNamespace(_, _, _, decls, _, _, _, _)) = flattenDefns decls match res with - | ParsedInput.SigFile (ParsedSigFileInput (_, _, _, _, specs)) -> + | ParsedInput.SigFile (ParsedSigFileInput (modules = specs)) -> printfn "parsing yielded %d specs" (List.collect flattenModSpec specs).Length | ParsedInput.ImplFile (ParsedImplFileInput (modules = impls)) -> printfn "parsing yielded %d definitions" (List.collect flattenModImpl impls).Length @@ -345,7 +347,8 @@ let EmptyParsedInput(filename, isLastCompiland) = QualFileNameOfImpls filename [], [], [], - [] + [], + { ConditionalDirectives = [] } ) ) else @@ -648,7 +651,7 @@ let ProcessMetaCommandsFromInput decls match inp with - | ParsedInput.SigFile (ParsedSigFileInput (_, _, _, hashDirectives, specs)) -> + | ParsedInput.SigFile (ParsedSigFileInput (hashDirectives = hashDirectives; modules = specs)) -> let state = List.fold ProcessMetaCommand state0 hashDirectives let state = List.fold ProcessMetaCommandsFromModuleSpec state specs state @@ -835,7 +838,7 @@ let TypeCheckOneInput(checkForErrors, let m = inp.Range let amap = tcImports.GetImportMap() match inp with - | ParsedInput.SigFile (ParsedSigFileInput (_, qualNameOfFile, _, _, _) as file) -> + | ParsedInput.SigFile (ParsedSigFileInput (qualifiedNameOfFile = qualNameOfFile) as file) -> // Check if we've seen this top module signature before. if Zmap.mem qualNameOfFile tcState.tcsRootSigs then diff --git a/src/fsharp/SyntaxTree.fs b/src/fsharp/SyntaxTree.fs index 394bf04557f..7665e7c3a26 100644 --- a/src/fsharp/SyntaxTree.fs +++ b/src/fsharp/SyntaxTree.fs @@ -2024,7 +2024,8 @@ type ParsedSigFileInput = qualifiedNameOfFile: QualifiedNameOfFile * scopedPragmas: ScopedPragma list * hashDirectives: ParsedHashDirective list * - modules: SynModuleOrNamespaceSig list + modules: SynModuleOrNamespaceSig list * + trivia: ParsedSigFileInputTrivia [] type ParsedInput = diff --git a/src/fsharp/SyntaxTree.fsi b/src/fsharp/SyntaxTree.fsi index 6d9b87badaf..cf5d6e02594 100644 --- a/src/fsharp/SyntaxTree.fsi +++ b/src/fsharp/SyntaxTree.fsi @@ -2218,7 +2218,8 @@ type ParsedSigFileInput = qualifiedNameOfFile: QualifiedNameOfFile * scopedPragmas: ScopedPragma list * hashDirectives: ParsedHashDirective list * - modules: SynModuleOrNamespaceSig list + modules: SynModuleOrNamespaceSig list * + trivia: ParsedSigFileInputTrivia /// Represents the syntax tree for a parsed implementation or signature file [] diff --git a/src/fsharp/SyntaxTrivia.fs b/src/fsharp/SyntaxTrivia.fs index 9ea4855532a..0a5a8a73ef5 100644 --- a/src/fsharp/SyntaxTrivia.fs +++ b/src/fsharp/SyntaxTrivia.fs @@ -20,6 +20,10 @@ and [] IfDirectiveExpression = type ParsedImplFileInputTrivia = { ConditionalDirectives: ConditionalDirectiveTrivia list } +[] +type ParsedSigFileInputTrivia = + { ConditionalDirectives: ConditionalDirectiveTrivia list } + [] type SynExprTryWithTrivia = { TryKeyword: range diff --git a/src/fsharp/SyntaxTrivia.fsi b/src/fsharp/SyntaxTrivia.fsi index 06ad48bf2be..9dd11006679 100644 --- a/src/fsharp/SyntaxTrivia.fsi +++ b/src/fsharp/SyntaxTrivia.fsi @@ -24,6 +24,14 @@ type ParsedImplFileInputTrivia = ConditionalDirectives: ConditionalDirectiveTrivia list } +/// Represents additional information for ParsedSigFileInputTrivia +[] +type ParsedSigFileInputTrivia = + { + /// Preprocessor directives of type #if, #else or #endif + ConditionalDirectives: ConditionalDirectiveTrivia list + } + /// Represents additional information for SynExpr.TryWith [] type SynExprTryWithTrivia = diff --git a/src/fsharp/service/ServiceNavigation.fs b/src/fsharp/service/ServiceNavigation.fs index 1446b607ad8..a0935471e1f 100755 --- a/src/fsharp/service/ServiceNavigation.fs +++ b/src/fsharp/service/ServiceNavigation.fs @@ -589,7 +589,7 @@ module NavigateTo = let ctor = mapMemberKind memberFlags.MemberKind addValSig ctor valSig isSig container - let rec walkSigFileInput (ParsedSigFileInput (fileName, _, _, _, moduleOrNamespaceList)) = + let rec walkSigFileInput (ParsedSigFileInput (fileName = fileName; modules = moduleOrNamespaceList)) = for item in moduleOrNamespaceList do walkSynModuleOrNamespaceSig item { Type = NavigableContainerType.File; Name = fileName } diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index 43bbdfd2d49..bb5dd1fb803 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -5619,9 +5619,11 @@ FSharp.Compiler.Syntax.ParsedSigFileFragment: Int32 Tag FSharp.Compiler.Syntax.ParsedSigFileFragment: Int32 get_Tag() FSharp.Compiler.Syntax.ParsedSigFileFragment: System.String ToString() FSharp.Compiler.Syntax.ParsedSigFileInput -FSharp.Compiler.Syntax.ParsedSigFileInput: FSharp.Compiler.Syntax.ParsedSigFileInput NewParsedSigFileInput(System.String, FSharp.Compiler.Syntax.QualifiedNameOfFile, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.ScopedPragma], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.ParsedHashDirective], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleOrNamespaceSig]) +FSharp.Compiler.Syntax.ParsedSigFileInput: FSharp.Compiler.Syntax.ParsedSigFileInput NewParsedSigFileInput(System.String, FSharp.Compiler.Syntax.QualifiedNameOfFile, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.ScopedPragma], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.ParsedHashDirective], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynModuleOrNamespaceSig], FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia) FSharp.Compiler.Syntax.ParsedSigFileInput: FSharp.Compiler.Syntax.QualifiedNameOfFile get_qualifiedNameOfFile() FSharp.Compiler.Syntax.ParsedSigFileInput: FSharp.Compiler.Syntax.QualifiedNameOfFile qualifiedNameOfFile +FSharp.Compiler.Syntax.ParsedSigFileInput: FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia get_trivia() +FSharp.Compiler.Syntax.ParsedSigFileInput: FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia trivia FSharp.Compiler.Syntax.ParsedSigFileInput: Int32 Tag FSharp.Compiler.Syntax.ParsedSigFileInput: Int32 get_Tag() FSharp.Compiler.Syntax.ParsedSigFileInput: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.ParsedHashDirective] get_hashDirectives() @@ -9157,6 +9159,11 @@ FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia: Microsoft.FSharp.Collect FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia] get_ConditionalDirectives() FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia: System.String ToString() FSharp.Compiler.SyntaxTrivia.ParsedImplFileInputTrivia: Void .ctor(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia]) +FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia +FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia] ConditionalDirectives +FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia] get_ConditionalDirectives() +FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.ParsedSigFileInputTrivia: Void .ctor(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia]) FSharp.Compiler.SyntaxTrivia.SynBindingTrivia FSharp.Compiler.SyntaxTrivia.SynBindingTrivia: FSharp.Compiler.SyntaxTrivia.SynBindingTrivia Zero FSharp.Compiler.SyntaxTrivia.SynBindingTrivia: FSharp.Compiler.SyntaxTrivia.SynBindingTrivia get_Zero() diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index 0003091cf3d..01bcac34cc2 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -3304,16 +3304,16 @@ async { Assert.Fail "Could not get valid AST" module ConditionalDirectives = - let private getDirectiveTrivia source = - let ast = getParseResults source + let private getDirectiveTrivia isSignatureFile source = + let ast = (if isSignatureFile then getParseResultsOfSignatureFile else getParseResults) source match ast with - | ParsedInput.ImplFile(ParsedImplFileInput(trivia = { ConditionalDirectives = trivia })) -> trivia - | ParsedInput.SigFile _ -> [] + | ParsedInput.ImplFile(ParsedImplFileInput(trivia = { ConditionalDirectives = trivia })) + | ParsedInput.SigFile(ParsedSigFileInput(trivia = { ConditionalDirectives = trivia })) -> trivia [] let ``single #if / #endif`` () = let trivia = - getDirectiveTrivia """ + getDirectiveTrivia false """ let v = #if DEBUG () @@ -3336,7 +3336,7 @@ let v = [] let ``single #if / #else / #endif`` () = let trivia = - getDirectiveTrivia """ + getDirectiveTrivia false """ let v = #if DEBUG 30 @@ -3362,7 +3362,7 @@ let v = [] let ``nested #if / #else / #endif`` () = let trivia = - getDirectiveTrivia """ + getDirectiveTrivia false """ let v = #if FOO #if MEH @@ -3400,9 +3400,9 @@ let v = Assert.Fail $"Unexpected trivia, got {trivia}" [] - let ``nested #if / ##endif with complex expressions`` () = + let ``nested #if / #endif with complex expressions`` () = let trivia = - getDirectiveTrivia """ + getDirectiveTrivia false """ let v = #if !DEBUG #if FOO && BAR @@ -3444,7 +3444,7 @@ let v = [] let ``directives in multiline comment are not reported as trivia`` () = let trivia = - getDirectiveTrivia """ + getDirectiveTrivia false """ let v = (* #if DEBUG @@ -3462,7 +3462,7 @@ let v = [] let ``directives in multiline string are not reported as trivia`` () = let trivia = - getDirectiveTrivia " + getDirectiveTrivia false " let v = \"\"\" #if DEBUG () @@ -3474,4 +3474,183 @@ let v = \"\"\" match trivia with | [] -> Assert.Pass() | _ -> - Assert.Fail $"Unexpected trivia, got {trivia}" \ No newline at end of file + Assert.Fail $"Unexpected trivia, got {trivia}" + + [] + let ``single #if / #endif, signature file`` () = + let trivia = + getDirectiveTrivia true """ +namespace Foobar + +val v: int = + #if DEBUG + 1 + #endif + 42 +""" + + match trivia with + | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] -> + assertRange (5, 4) (5, 13) mIf + assertRange (7, 4) (7, 10) mEndif + + match expr with + | IfDirectiveExpression.IfdefId "DEBUG" -> () + | _ -> Assert.Fail $"Expected different expression, got {expr}" + | _ -> + Assert.Fail $"Unexpected trivia, got {trivia}" + + [] + let ``single #if / #else / #endif, signature file`` () = + let trivia = + getDirectiveTrivia true """ +namespace Foobar + +val v : int = + #if DEBUG + 30 + #else + 42 + #endif +""" + + match trivia with + | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) + ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] -> + assertRange (5, 4) (5, 13) mIf + assertRange (7, 4) (7, 9) mElse + assertRange (9, 4) (9, 10) mEndif + + match expr with + | IfDirectiveExpression.IfdefId "DEBUG" -> () + | _ -> Assert.Fail $"Expected different expression, got {expr}" + | _ -> + Assert.Fail $"Unexpected trivia, got {trivia}" + + [] + let ``nested #if / #else / #endif, signature file`` () = + let trivia = + getDirectiveTrivia true """ +namespace Foobar + +val v : int = + #if FOO + #if MEH + 1 + #else + 2 + #endif + #else + 3 + #endif +""" + + match trivia with + | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr1, mIf1) + ConditionalDirectiveTrivia.IfDirectiveTrivia(expr2, mIf2) + ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse1 + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif1 + ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse2 + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif2 ] -> + assertRange (5, 4) (5, 11) mIf1 + assertRange (6, 8) (6, 15) mIf2 + assertRange (8, 8) (8, 13) mElse1 + assertRange (10, 8) (10, 14) mEndif1 + assertRange (11, 4) (11, 9) mElse2 + assertRange (13, 4) (13, 10) mEndif2 + + match expr1 with + | IfDirectiveExpression.IfdefId "FOO" -> () + | _ -> Assert.Fail $"Expected different expression, got {expr1}" + + match expr2 with + | IfDirectiveExpression.IfdefId "MEH" -> () + | _ -> Assert.Fail $"Expected different expression, got {expr2}" + | _ -> + Assert.Fail $"Unexpected trivia, got {trivia}" + + [] + let ``nested #if / #endif with complex expressions, signature file`` () = + let trivia = + getDirectiveTrivia true """ +namespace Foobar + +val v : int = + #if !DEBUG + #if FOO && BAR + #if MEH || HMM + 9 + #endif + #endif + #endif + 10 +""" + + match trivia with + | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr1, mIf1) + ConditionalDirectiveTrivia.IfDirectiveTrivia(expr2, mIf2) + ConditionalDirectiveTrivia.IfDirectiveTrivia(expr3, mIf3) + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif1 + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif2 + ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif3 ] -> + assertRange (5, 4) (5, 14) mIf1 + assertRange (6, 8) (6, 22) mIf2 + assertRange (7, 12) (7, 26) mIf3 + assertRange (9, 12) (9, 18) mEndif1 + assertRange (10, 8) (10, 14) mEndif2 + assertRange (11, 4) (11, 10) mEndif3 + + match expr1 with + | IfDirectiveExpression.IfdefNot (IfDirectiveExpression.IfdefId "DEBUG") -> () + | _ -> Assert.Fail $"Expected different expression, got {expr1}" + + match expr2 with + | IfDirectiveExpression.IfdefAnd(IfDirectiveExpression.IfdefId "FOO", IfDirectiveExpression.IfdefId "BAR") -> () + | _ -> Assert.Fail $"Expected different expression, got {expr2}" + + match expr3 with + | IfDirectiveExpression.IfdefOr(IfDirectiveExpression.IfdefId "MEH", IfDirectiveExpression.IfdefId "HMM") -> () + | _ -> Assert.Fail $"Expected different expression, got {expr3}" + | _ -> + Assert.Fail $"Unexpected trivia, got {trivia}" + + [] + let ``directives in multiline comment are not reported as trivia, signature file`` () = + let trivia = + getDirectiveTrivia true """ +namespace Foobar + +val v : int = +(* + #if DEBUG + () + #endif +*) + 42 +""" + + match trivia with + | [] -> Assert.Pass() + | _ -> + Assert.Fail $"Unexpected trivia, got {trivia}" + + [] + let ``directives in multiline string are not reported as trivia, signature file`` () = + let trivia = + getDirectiveTrivia true " +namespace Foobar + +let v : string = \"\"\" + #if DEBUG + () + #endif + 42 +\"\"\" +" + + match trivia with + | [] -> Assert.Pass() + | _ -> + Assert.Fail $"Unexpected trivia, got {trivia}" From 6e9c5b645872cee0c216e67e348387bbf67f2ca2 Mon Sep 17 00:00:00 2001 From: nojaf Date: Thu, 17 Mar 2022 08:12:54 +0100 Subject: [PATCH 7/7] Simplify ConditionalDirectiveTrivia union names. --- src/fsharp/ParseHelpers.fs | 14 +-- src/fsharp/SyntaxTrivia.fs | 14 +-- src/fsharp/SyntaxTrivia.fsi | 20 ++-- ...erService.SurfaceArea.netstandard.expected | 110 +++++++++--------- tests/service/Symbols.fs | 96 +++++++-------- 5 files changed, 127 insertions(+), 127 deletions(-) diff --git a/src/fsharp/ParseHelpers.fs b/src/fsharp/ParseHelpers.fs index f261f98812d..494b2635bfe 100644 --- a/src/fsharp/ParseHelpers.fs +++ b/src/fsharp/ParseHelpers.fs @@ -202,26 +202,26 @@ module LexbufIfdefStore = let expr = let rec visit (expr: LexerIfdefExpression) : IfDirectiveExpression = match expr with - | LexerIfdefExpression.IfdefAnd(l,r) -> IfDirectiveExpression.IfdefAnd(visit l, visit r) - | LexerIfdefExpression.IfdefOr(l, r) -> IfDirectiveExpression.IfdefOr(visit l, visit r) - | LexerIfdefExpression.IfdefNot e -> IfDirectiveExpression.IfdefNot(visit e) - | LexerIfdefExpression.IfdefId id -> IfDirectiveExpression.IfdefId id + | LexerIfdefExpression.IfdefAnd(l,r) -> IfDirectiveExpression.And(visit l, visit r) + | LexerIfdefExpression.IfdefOr(l, r) -> IfDirectiveExpression.Or(visit l, visit r) + | LexerIfdefExpression.IfdefNot e -> IfDirectiveExpression.Not(visit e) + | LexerIfdefExpression.IfdefId id -> IfDirectiveExpression.Ident id visit expr let m = mkRangeWithoutLeadingWhitespace lexed range - store.Add(ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, m)) + store.Add(ConditionalDirectiveTrivia.If(expr, m)) let SaveElseHash (lexbuf: Lexbuf, lexed:string, range: range) = let store = getStore lexbuf let m = mkRangeWithoutLeadingWhitespace lexed range - store.Add(ConditionalDirectiveTrivia.ElseDirectiveTrivia(m)) + store.Add(ConditionalDirectiveTrivia.Else(m)) let SaveEndIfHash (lexbuf: Lexbuf, lexed:string, range: range) = let store = getStore lexbuf let m = mkRangeWithoutLeadingWhitespace lexed range - store.Add(ConditionalDirectiveTrivia.EndIfDirectiveTrivia(m)) + store.Add(ConditionalDirectiveTrivia.EndIf(m)) let GetTrivia (lexbuf: Lexbuf): ConditionalDirectiveTrivia list = let store = getStore lexbuf diff --git a/src/fsharp/SyntaxTrivia.fs b/src/fsharp/SyntaxTrivia.fs index 0a5a8a73ef5..04031b83940 100644 --- a/src/fsharp/SyntaxTrivia.fs +++ b/src/fsharp/SyntaxTrivia.fs @@ -6,15 +6,15 @@ open FSharp.Compiler.Text [] type ConditionalDirectiveTrivia = - | IfDirectiveTrivia of expr:IfDirectiveExpression * range:range - | ElseDirectiveTrivia of range:range - | EndIfDirectiveTrivia of range:range + | If of expr:IfDirectiveExpression * range:range + | Else of range:range + | EndIf of range:range and [] IfDirectiveExpression = - | IfdefAnd of IfDirectiveExpression * IfDirectiveExpression - | IfdefOr of IfDirectiveExpression * IfDirectiveExpression - | IfdefNot of IfDirectiveExpression - | IfdefId of string + | And of IfDirectiveExpression * IfDirectiveExpression + | Or of IfDirectiveExpression * IfDirectiveExpression + | Not of IfDirectiveExpression + | Ident of string [] type ParsedImplFileInputTrivia = diff --git a/src/fsharp/SyntaxTrivia.fsi b/src/fsharp/SyntaxTrivia.fsi index 9dd11006679..fbf84c8f560 100644 --- a/src/fsharp/SyntaxTrivia.fsi +++ b/src/fsharp/SyntaxTrivia.fsi @@ -1,20 +1,20 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -namespace FSharp.Compiler.SyntaxTrivia +namespace rec FSharp.Compiler.SyntaxTrivia open FSharp.Compiler.Text [] type ConditionalDirectiveTrivia = - | IfDirectiveTrivia of expr:IfDirectiveExpression * range:range - | ElseDirectiveTrivia of range:range - | EndIfDirectiveTrivia of range:range - -and [] IfDirectiveExpression = - | IfdefAnd of IfDirectiveExpression * IfDirectiveExpression - | IfdefOr of IfDirectiveExpression * IfDirectiveExpression - | IfdefNot of IfDirectiveExpression - | IfdefId of string + | If of expr:IfDirectiveExpression * range:range + | Else of range:range + | EndIf of range:range + +type [] IfDirectiveExpression = + | And of IfDirectiveExpression * IfDirectiveExpression + | Or of IfDirectiveExpression * IfDirectiveExpression + | Not of IfDirectiveExpression + | Ident of string /// Represents additional information for ParsedImplFileInput [] diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index bb5dd1fb803..7b2c727a8a7 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -9090,66 +9090,66 @@ FSharp.Compiler.Syntax.TyparStaticReq: Int32 Tag FSharp.Compiler.Syntax.TyparStaticReq: Int32 get_Tag() FSharp.Compiler.Syntax.TyparStaticReq: System.String ToString() FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+ElseDirectiveTrivia: FSharp.Compiler.Text.Range get_range() -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+ElseDirectiveTrivia: FSharp.Compiler.Text.Range range -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+EndIfDirectiveTrivia: FSharp.Compiler.Text.Range get_range() -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+EndIfDirectiveTrivia: FSharp.Compiler.Text.Range range -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+IfDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression expr -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+IfDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_expr() -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+IfDirectiveTrivia: FSharp.Compiler.Text.Range get_range() -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+IfDirectiveTrivia: FSharp.Compiler.Text.Range range -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags: Int32 ElseDirectiveTrivia -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags: Int32 EndIfDirectiveTrivia -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags: Int32 IfDirectiveTrivia -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean IsElseDirectiveTrivia -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean IsEndIfDirectiveTrivia -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean IsIfDirectiveTrivia -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean get_IsElseDirectiveTrivia() -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean get_IsEndIfDirectiveTrivia() -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean get_IsIfDirectiveTrivia() -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia NewElseDirectiveTrivia(FSharp.Compiler.Text.Range) -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia NewEndIfDirectiveTrivia(FSharp.Compiler.Text.Range) -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia NewIfDirectiveTrivia(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression, FSharp.Compiler.Text.Range) -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+ElseDirectiveTrivia -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+EndIfDirectiveTrivia -FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+IfDirectiveTrivia +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Else: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Else: FSharp.Compiler.Text.Range range +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+EndIf: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+EndIf: FSharp.Compiler.Text.Range range +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+If: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression expr +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+If: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_expr() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+If: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+If: FSharp.Compiler.Text.Range range +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags: Int32 Else +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags: Int32 EndIf +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags: Int32 If +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean IsElse +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean IsEndIf +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean IsIf +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean get_IsElse() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean get_IsEndIf() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Boolean get_IsIf() +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia NewElse(FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia NewEndIf(FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia NewIf(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression, FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Else +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+EndIf +FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+If FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia+Tags FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Int32 Tag FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Int32 get_Tag() FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: System.String ToString() FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefAnd: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item1 -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefAnd: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item2 -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefAnd: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item1() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefAnd: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item2() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefId: System.String Item -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefId: System.String get_Item() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefNot: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefNot: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item1 -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item2 -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item1() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item2() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefAnd -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefId -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefNot -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 IfdefOr -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefAnd -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefId -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefNot -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIfdefOr -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsIfdefAnd() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsIfdefId() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsIfdefNot() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsIfdefOr() -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewIfdefAnd(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression, FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewIfdefId(System.String) -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewIfdefNot(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewIfdefOr(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression, FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefAnd -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefId -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefNot -FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+IfdefOr +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+And: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item1 +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+And: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item2 +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+And: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item1() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+And: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item2() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Ident: System.String Item +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Ident: System.String get_Item() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Not: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Not: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Or: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item1 +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Or: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression Item2 +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Or: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item1() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Or: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression get_Item2() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 And +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 Ident +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 Not +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags: Int32 Or +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsAnd +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsIdent +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsNot +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean IsOr +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsAnd() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsIdent() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsNot() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Boolean get_IsOr() +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewAnd(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression, FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewIdent(System.String) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewNot(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression NewOr(FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression, FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression) +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+And +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Ident +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Not +FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Or FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression+Tags FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 Tag FSharp.Compiler.SyntaxTrivia.IfDirectiveExpression: Int32 get_Tag() diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index 01bcac34cc2..ce9c9c8e478 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -3322,13 +3322,13 @@ let v = """ match trivia with - | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] -> + | [ ConditionalDirectiveTrivia.If(expr, mIf) + ConditionalDirectiveTrivia.EndIf mEndif ] -> assertRange (3, 4) (3, 13) mIf assertRange (5, 4) (5, 10) mEndif match expr with - | IfDirectiveExpression.IfdefId "DEBUG" -> () + | IfDirectiveExpression.Ident "DEBUG" -> () | _ -> Assert.Fail $"Expected different expression, got {expr}" | _ -> Assert.Fail $"Unexpected trivia, got {trivia}" @@ -3346,15 +3346,15 @@ let v = """ match trivia with - | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) - ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] -> + | [ ConditionalDirectiveTrivia.If(expr, mIf) + ConditionalDirectiveTrivia.Else mElse + ConditionalDirectiveTrivia.EndIf mEndif ] -> assertRange (3, 4) (3, 13) mIf assertRange (5, 4) (5, 9) mElse assertRange (7, 4) (7, 10) mEndif match expr with - | IfDirectiveExpression.IfdefId "DEBUG" -> () + | IfDirectiveExpression.Ident "DEBUG" -> () | _ -> Assert.Fail $"Expected different expression, got {expr}" | _ -> Assert.Fail $"Unexpected trivia, got {trivia}" @@ -3376,12 +3376,12 @@ let v = """ match trivia with - | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr1, mIf1) - ConditionalDirectiveTrivia.IfDirectiveTrivia(expr2, mIf2) - ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse1 - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif1 - ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse2 - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif2 ] -> + | [ ConditionalDirectiveTrivia.If(expr1, mIf1) + ConditionalDirectiveTrivia.If(expr2, mIf2) + ConditionalDirectiveTrivia.Else mElse1 + ConditionalDirectiveTrivia.EndIf mEndif1 + ConditionalDirectiveTrivia.Else mElse2 + ConditionalDirectiveTrivia.EndIf mEndif2 ] -> assertRange (3, 4) (3, 11) mIf1 assertRange (4, 8) (4, 15) mIf2 assertRange (6, 8) (6, 13) mElse1 @@ -3390,11 +3390,11 @@ let v = assertRange (11, 4) (11, 10) mEndif2 match expr1 with - | IfDirectiveExpression.IfdefId "FOO" -> () + | IfDirectiveExpression.Ident "FOO" -> () | _ -> Assert.Fail $"Expected different expression, got {expr1}" match expr2 with - | IfDirectiveExpression.IfdefId "MEH" -> () + | IfDirectiveExpression.Ident "MEH" -> () | _ -> Assert.Fail $"Expected different expression, got {expr2}" | _ -> Assert.Fail $"Unexpected trivia, got {trivia}" @@ -3414,12 +3414,12 @@ let v = """ match trivia with - | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr1, mIf1) - ConditionalDirectiveTrivia.IfDirectiveTrivia(expr2, mIf2) - ConditionalDirectiveTrivia.IfDirectiveTrivia(expr3, mIf3) - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif1 - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif2 - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif3 ] -> + | [ ConditionalDirectiveTrivia.If(expr1, mIf1) + ConditionalDirectiveTrivia.If(expr2, mIf2) + ConditionalDirectiveTrivia.If(expr3, mIf3) + ConditionalDirectiveTrivia.EndIf mEndif1 + ConditionalDirectiveTrivia.EndIf mEndif2 + ConditionalDirectiveTrivia.EndIf mEndif3 ] -> assertRange (3, 4) (3, 14) mIf1 assertRange (4, 8) (4, 22) mIf2 assertRange (5, 12) (5, 26) mIf3 @@ -3428,15 +3428,15 @@ let v = assertRange (9, 4) (9, 10) mEndif3 match expr1 with - | IfDirectiveExpression.IfdefNot (IfDirectiveExpression.IfdefId "DEBUG") -> () + | IfDirectiveExpression.Not (IfDirectiveExpression.Ident "DEBUG") -> () | _ -> Assert.Fail $"Expected different expression, got {expr1}" match expr2 with - | IfDirectiveExpression.IfdefAnd(IfDirectiveExpression.IfdefId "FOO", IfDirectiveExpression.IfdefId "BAR") -> () + | IfDirectiveExpression.And(IfDirectiveExpression.Ident "FOO", IfDirectiveExpression.Ident "BAR") -> () | _ -> Assert.Fail $"Expected different expression, got {expr2}" match expr3 with - | IfDirectiveExpression.IfdefOr(IfDirectiveExpression.IfdefId "MEH", IfDirectiveExpression.IfdefId "HMM") -> () + | IfDirectiveExpression.Or(IfDirectiveExpression.Ident "MEH", IfDirectiveExpression.Ident "HMM") -> () | _ -> Assert.Fail $"Expected different expression, got {expr3}" | _ -> Assert.Fail $"Unexpected trivia, got {trivia}" @@ -3490,13 +3490,13 @@ val v: int = """ match trivia with - | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] -> + | [ ConditionalDirectiveTrivia.If(expr, mIf) + ConditionalDirectiveTrivia.EndIf mEndif ] -> assertRange (5, 4) (5, 13) mIf assertRange (7, 4) (7, 10) mEndif match expr with - | IfDirectiveExpression.IfdefId "DEBUG" -> () + | IfDirectiveExpression.Ident "DEBUG" -> () | _ -> Assert.Fail $"Expected different expression, got {expr}" | _ -> Assert.Fail $"Unexpected trivia, got {trivia}" @@ -3516,15 +3516,15 @@ val v : int = """ match trivia with - | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr, mIf) - ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif ] -> + | [ ConditionalDirectiveTrivia.If(expr, mIf) + ConditionalDirectiveTrivia.Else mElse + ConditionalDirectiveTrivia.EndIf mEndif ] -> assertRange (5, 4) (5, 13) mIf assertRange (7, 4) (7, 9) mElse assertRange (9, 4) (9, 10) mEndif match expr with - | IfDirectiveExpression.IfdefId "DEBUG" -> () + | IfDirectiveExpression.Ident "DEBUG" -> () | _ -> Assert.Fail $"Expected different expression, got {expr}" | _ -> Assert.Fail $"Unexpected trivia, got {trivia}" @@ -3548,12 +3548,12 @@ val v : int = """ match trivia with - | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr1, mIf1) - ConditionalDirectiveTrivia.IfDirectiveTrivia(expr2, mIf2) - ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse1 - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif1 - ConditionalDirectiveTrivia.ElseDirectiveTrivia mElse2 - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif2 ] -> + | [ ConditionalDirectiveTrivia.If(expr1, mIf1) + ConditionalDirectiveTrivia.If(expr2, mIf2) + ConditionalDirectiveTrivia.Else mElse1 + ConditionalDirectiveTrivia.EndIf mEndif1 + ConditionalDirectiveTrivia.Else mElse2 + ConditionalDirectiveTrivia.EndIf mEndif2 ] -> assertRange (5, 4) (5, 11) mIf1 assertRange (6, 8) (6, 15) mIf2 assertRange (8, 8) (8, 13) mElse1 @@ -3562,11 +3562,11 @@ val v : int = assertRange (13, 4) (13, 10) mEndif2 match expr1 with - | IfDirectiveExpression.IfdefId "FOO" -> () + | IfDirectiveExpression.Ident "FOO" -> () | _ -> Assert.Fail $"Expected different expression, got {expr1}" match expr2 with - | IfDirectiveExpression.IfdefId "MEH" -> () + | IfDirectiveExpression.Ident "MEH" -> () | _ -> Assert.Fail $"Expected different expression, got {expr2}" | _ -> Assert.Fail $"Unexpected trivia, got {trivia}" @@ -3589,12 +3589,12 @@ val v : int = """ match trivia with - | [ ConditionalDirectiveTrivia.IfDirectiveTrivia(expr1, mIf1) - ConditionalDirectiveTrivia.IfDirectiveTrivia(expr2, mIf2) - ConditionalDirectiveTrivia.IfDirectiveTrivia(expr3, mIf3) - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif1 - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif2 - ConditionalDirectiveTrivia.EndIfDirectiveTrivia mEndif3 ] -> + | [ ConditionalDirectiveTrivia.If(expr1, mIf1) + ConditionalDirectiveTrivia.If(expr2, mIf2) + ConditionalDirectiveTrivia.If(expr3, mIf3) + ConditionalDirectiveTrivia.EndIf mEndif1 + ConditionalDirectiveTrivia.EndIf mEndif2 + ConditionalDirectiveTrivia.EndIf mEndif3 ] -> assertRange (5, 4) (5, 14) mIf1 assertRange (6, 8) (6, 22) mIf2 assertRange (7, 12) (7, 26) mIf3 @@ -3603,15 +3603,15 @@ val v : int = assertRange (11, 4) (11, 10) mEndif3 match expr1 with - | IfDirectiveExpression.IfdefNot (IfDirectiveExpression.IfdefId "DEBUG") -> () + | IfDirectiveExpression.Not (IfDirectiveExpression.Ident "DEBUG") -> () | _ -> Assert.Fail $"Expected different expression, got {expr1}" match expr2 with - | IfDirectiveExpression.IfdefAnd(IfDirectiveExpression.IfdefId "FOO", IfDirectiveExpression.IfdefId "BAR") -> () + | IfDirectiveExpression.And(IfDirectiveExpression.Ident "FOO", IfDirectiveExpression.Ident "BAR") -> () | _ -> Assert.Fail $"Expected different expression, got {expr2}" match expr3 with - | IfDirectiveExpression.IfdefOr(IfDirectiveExpression.IfdefId "MEH", IfDirectiveExpression.IfdefId "HMM") -> () + | IfDirectiveExpression.Or(IfDirectiveExpression.Ident "MEH", IfDirectiveExpression.Ident "HMM") -> () | _ -> Assert.Fail $"Expected different expression, got {expr3}" | _ -> Assert.Fail $"Unexpected trivia, got {trivia}"