Skip to content

Commit b4b1aaa

Browse files
authored
Introduce ConditionalDirectiveTrivia. (#12843)
* Introduce ConditionalDirectiveTrivia. * Store correct start column of directive. * Add RequireQualifiedAccess to IfDirectiveExpression. * Verify nested scenarios and complex expressions. * Add tests for multiline comments and strings. * Add trivia for ParsedSigFileInput. * Simplify ConditionalDirectiveTrivia union names.
1 parent c19b997 commit b4b1aaa

17 files changed

+603
-41
lines changed

src/fsharp/CheckDeclarations.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5959,7 +5959,7 @@ let TypeCheckOneImplFile
59595959
rootSigOpt: ModuleOrNamespaceType option,
59605960
synImplFile) =
59615961

5962-
let (ParsedImplFileInput (_, isScript, qualNameOfFile, scopedPragmas, _, implFileFrags, isLastCompiland)) = synImplFile
5962+
let (ParsedImplFileInput (_, isScript, qualNameOfFile, scopedPragmas, _, implFileFrags, isLastCompiland, _)) = synImplFile
59635963
let infoReader = InfoReader(g, amap)
59645964

59655965
cancellable {
@@ -6080,7 +6080,7 @@ let TypeCheckOneImplFile
60806080

60816081

60826082
/// Check an entire signature file
6083-
let TypeCheckOneSigFile (g, niceNameGen, amap, topCcu, checkForErrors, conditionalDefines, tcSink, isInternalTestSpanStackReferring) tcEnv (ParsedSigFileInput (_, qualNameOfFile, _, _, sigFileFrags)) =
6083+
let TypeCheckOneSigFile (g, niceNameGen, amap, topCcu, checkForErrors, conditionalDefines, tcSink, isInternalTestSpanStackReferring) tcEnv (ParsedSigFileInput (qualifiedNameOfFile = qualNameOfFile; modules = sigFileFrags)) =
60846084
cancellable {
60856085
let cenv =
60866086
cenv.Create

src/fsharp/ParseAndCheckInputs.fs

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,11 @@ let PrependPathToSpec x (SynModuleOrNamespaceSig(p, b, c, d, e, f, g, h)) =
8080

8181
let PrependPathToInput x inp =
8282
match inp with
83-
| ParsedInput.ImplFile (ParsedImplFileInput (b, c, q, d, hd, impls, e)) ->
84-
ParsedInput.ImplFile (ParsedImplFileInput (b, c, PrependPathToQualFileName x q, d, hd, List.map (PrependPathToImpl x) impls, e))
83+
| ParsedInput.ImplFile (ParsedImplFileInput (b, c, q, d, hd, impls, e, trivia)) ->
84+
ParsedInput.ImplFile (ParsedImplFileInput (b, c, PrependPathToQualFileName x q, d, hd, List.map (PrependPathToImpl x) impls, e, trivia))
8585

86-
| ParsedInput.SigFile (ParsedSigFileInput (b, q, d, hd, specs)) ->
87-
ParsedInput.SigFile (ParsedSigFileInput (b, PrependPathToQualFileName x q, d, hd, List.map (PrependPathToSpec x) specs))
86+
| ParsedInput.SigFile (ParsedSigFileInput (b, q, d, hd, specs, trivia)) ->
87+
ParsedInput.SigFile (ParsedSigFileInput (b, PrependPathToQualFileName x q, d, hd, List.map (PrependPathToSpec x) specs, trivia))
8888

8989
let ComputeAnonModuleName check defaultNamespace filename (m: range) =
9090
let modname = CanonicalizeFilename filename
@@ -178,7 +178,7 @@ let GetScopedPragmasForHashDirective hd =
178178
| Some n -> yield ScopedPragma.WarningOff(m, n)
179179
| _ -> () ]
180180

181-
let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImplFile (hashDirectives, impls)) =
181+
let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImplFile (hashDirectives, impls), lexbuf: UnicodeLexing.Lexbuf) =
182182
match impls |> List.rev |> List.tryPick (function ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, _, _, _, _, _, _, _)) -> Some lid | _ -> None) with
183183
| Some lid when impls.Length > 1 ->
184184
errorR(Error(FSComp.SR.buildMultipleToplevelModules(), rangeOfLid lid))
@@ -197,9 +197,11 @@ let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImp
197197
for hd in hashDirectives do
198198
yield! GetScopedPragmasForHashDirective hd ]
199199

200-
ParsedInput.ImplFile (ParsedImplFileInput (filename, isScript, qualName, scopedPragmas, hashDirectives, impls, isLastCompiland))
200+
let conditionalDirectives = LexbufIfdefStore.GetTrivia(lexbuf)
201+
202+
ParsedInput.ImplFile (ParsedImplFileInput (filename, isScript, qualName, scopedPragmas, hashDirectives, impls, isLastCompiland, { ConditionalDirectives = conditionalDirectives }))
201203

202-
let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSigFile (hashDirectives, specs)) =
204+
let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSigFile (hashDirectives, specs), lexbuf: UnicodeLexing.Lexbuf) =
203205
match specs |> List.rev |> List.tryPick (function ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, _, _, _, _, _, _, _)) -> Some lid | _ -> None) with
204206
| Some lid when specs.Length > 1 ->
205207
errorR(Error(FSComp.SR.buildMultipleToplevelModules(), rangeOfLid lid))
@@ -217,7 +219,9 @@ let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSig
217219
for hd in hashDirectives do
218220
yield! GetScopedPragmasForHashDirective hd ]
219221

220-
ParsedInput.SigFile (ParsedSigFileInput (filename, qualName, scopedPragmas, hashDirectives, specs))
222+
let conditionalDirectives = LexbufIfdefStore.GetTrivia(lexbuf)
223+
224+
ParsedInput.SigFile (ParsedSigFileInput (filename, qualName, scopedPragmas, hashDirectives, specs, { ConditionalDirectives = conditionalDirectives }))
221225

222226
type ModuleNamesDict = Map<string,Map<string,QualifiedNameOfFile>>
223227

@@ -242,13 +246,13 @@ let DeduplicateModuleName (moduleNamesDict: ModuleNamesDict) fileName (qualNameO
242246
/// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed.
243247
let DeduplicateParsedInputModuleName (moduleNamesDict: ModuleNamesDict) input =
244248
match input with
245-
| ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput (fileName, isScript, qualNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) ->
249+
| ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput (fileName, isScript, qualNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe), trivia)) ->
246250
let qualNameOfFileT, moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile
247-
let inputT = ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput (fileName, isScript, qualNameOfFileT, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe)))
251+
let inputT = ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput (fileName, isScript, qualNameOfFileT, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe), trivia))
248252
inputT, moduleNamesDictT
249-
| ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput (fileName, qualNameOfFile, scopedPragmas, hashDirectives, modules)) ->
253+
| ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput (fileName, qualNameOfFile, scopedPragmas, hashDirectives, modules, trivia)) ->
250254
let qualNameOfFileT, moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile
251-
let inputT = ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput (fileName, qualNameOfFileT, scopedPragmas, hashDirectives, modules))
255+
let inputT = ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput (fileName, qualNameOfFileT, scopedPragmas, hashDirectives, modules, trivia))
252256
inputT, moduleNamesDictT
253257

254258
let ParseInput (lexer, diagnosticOptions:FSharpDiagnosticOptions, errorLogger: ErrorLogger, lexbuf: UnicodeLexing.Lexbuf, defaultNamespace, filename, isLastCompiland) =
@@ -279,11 +283,11 @@ let ParseInput (lexer, diagnosticOptions:FSharpDiagnosticOptions, errorLogger: E
279283
if FSharpImplFileSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then
280284
let impl = Parser.implementationFile lexer lexbuf
281285
LexbufLocalXmlDocStore.ReportInvalidXmlDocPositions(lexbuf)
282-
PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, impl)
286+
PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, impl, lexbuf)
283287
elif FSharpSigFileSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then
284288
let intfs = Parser.signatureFile lexer lexbuf
285289
LexbufLocalXmlDocStore.ReportInvalidXmlDocPositions(lexbuf)
286-
PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, intfs)
290+
PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, intfs, lexbuf)
287291
else
288292
if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then
289293
error(Error(FSComp.SR.buildInvalidSourceFileExtensionUpdated filename, rangeStartup))
@@ -329,7 +333,7 @@ let ReportParsingStatistics res =
329333
let flattenModSpec (SynModuleOrNamespaceSig(_, _, _, decls, _, _, _, _)) = flattenSpecs decls
330334
let flattenModImpl (SynModuleOrNamespace(_, _, _, decls, _, _, _, _)) = flattenDefns decls
331335
match res with
332-
| ParsedInput.SigFile (ParsedSigFileInput (_, _, _, _, specs)) ->
336+
| ParsedInput.SigFile (ParsedSigFileInput (modules = specs)) ->
333337
printfn "parsing yielded %d specs" (List.collect flattenModSpec specs).Length
334338
| ParsedInput.ImplFile (ParsedImplFileInput (modules = impls)) ->
335339
printfn "parsing yielded %d definitions" (List.collect flattenModImpl impls).Length
@@ -343,7 +347,8 @@ let EmptyParsedInput(filename, isLastCompiland) =
343347
QualFileNameOfImpls filename [],
344348
[],
345349
[],
346-
[]
350+
[],
351+
{ ConditionalDirectives = [] }
347352
)
348353
)
349354
else
@@ -355,7 +360,8 @@ let EmptyParsedInput(filename, isLastCompiland) =
355360
[],
356361
[],
357362
[],
358-
isLastCompiland
363+
isLastCompiland,
364+
{ ConditionalDirectives = [] }
359365
)
360366
)
361367

@@ -645,11 +651,11 @@ let ProcessMetaCommandsFromInput
645651
decls
646652

647653
match inp with
648-
| ParsedInput.SigFile (ParsedSigFileInput (_, _, _, hashDirectives, specs)) ->
654+
| ParsedInput.SigFile (ParsedSigFileInput (hashDirectives = hashDirectives; modules = specs)) ->
649655
let state = List.fold ProcessMetaCommand state0 hashDirectives
650656
let state = List.fold ProcessMetaCommandsFromModuleSpec state specs
651657
state
652-
| ParsedInput.ImplFile (ParsedImplFileInput (_, _, _, _, hashDirectives, impls, _)) ->
658+
| ParsedInput.ImplFile (ParsedImplFileInput (hashDirectives = hashDirectives; modules = impls)) ->
653659
let state = List.fold ProcessMetaCommand state0 hashDirectives
654660
let state = List.fold ProcessMetaCommandsFromModuleImpl state impls
655661
state
@@ -832,7 +838,7 @@ let TypeCheckOneInput(checkForErrors,
832838
let m = inp.Range
833839
let amap = tcImports.GetImportMap()
834840
match inp with
835-
| ParsedInput.SigFile (ParsedSigFileInput (_, qualNameOfFile, _, _, _) as file) ->
841+
| ParsedInput.SigFile (ParsedSigFileInput (qualifiedNameOfFile = qualNameOfFile) as file) ->
836842

837843
// Check if we've seen this top module signature before.
838844
if Zmap.mem qualNameOfFile tcState.tcsRootSigs then
@@ -871,7 +877,7 @@ let TypeCheckOneInput(checkForErrors,
871877

872878
return (tcEnv, EmptyTopAttrs, None, ccuSigForFile), tcState
873879

874-
| ParsedInput.ImplFile (ParsedImplFileInput (_, _, qualNameOfFile, _, _, _, _) as file) ->
880+
| ParsedInput.ImplFile (ParsedImplFileInput (qualifiedNameOfFile = qualNameOfFile) as file) ->
875881

876882
// Check if we've got an interface for this fragment
877883
let rootSigOpt = tcState.tcsRootSigs.TryFind qualNameOfFile

src/fsharp/ParseHelpers.fs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ open FSharp.Compiler.AbstractIL
66
open FSharp.Compiler.ErrorLogger
77
open FSharp.Compiler.Features
88
open FSharp.Compiler.Syntax
9+
open FSharp.Compiler.SyntaxTrivia
910
open FSharp.Compiler.SyntaxTreeOps
1011
open FSharp.Compiler.UnicodeLexing
1112
open FSharp.Compiler.Text
@@ -87,7 +88,6 @@ type IParseState with
8788
//------------------------------------------------------------------------
8889

8990
/// XmlDoc F# lexer/parser state, held in the BufferLocalStore for the lexer.
90-
/// This is the only use of the lexer BufferLocalStore in the codebase.
9191
module LexbufLocalXmlDocStore =
9292
// The key into the BufferLocalStore used to hold the current accumulated XmlDoc lines
9393
let private xmlDocKey = "XmlDoc"
@@ -177,6 +177,56 @@ let rec LexerIfdefEval (lookup: string -> bool) = function
177177
| IfdefNot e -> not (LexerIfdefEval lookup e)
178178
| IfdefId id -> lookup id
179179

180+
/// Ifdef F# lexer/parser state, held in the BufferLocalStore for the lexer.
181+
/// Used to capture #if, #else and #endif as syntax trivia.
182+
module LexbufIfdefStore =
183+
// The key into the BufferLocalStore used to hold the compiler directives
184+
let private ifDefKey = "Ifdef"
185+
186+
let private getStore (lexbuf: Lexbuf): ResizeArray<ConditionalDirectiveTrivia> =
187+
match lexbuf.BufferLocalStore.TryGetValue ifDefKey with
188+
| true, store -> store
189+
| _ ->
190+
let store = box (ResizeArray<ConditionalDirectiveTrivia>())
191+
lexbuf.BufferLocalStore.[ifDefKey] <- store
192+
store
193+
|> unbox<ResizeArray<ConditionalDirectiveTrivia>>
194+
195+
let private mkRangeWithoutLeadingWhitespace (lexed:string) (m:range): range =
196+
let startColumn = lexed.Length - lexed.TrimStart().Length
197+
mkFileIndexRange m.FileIndex (mkPos m.StartLine startColumn) m.End
198+
199+
let SaveIfHash (lexbuf: Lexbuf, lexed:string, expr: LexerIfdefExpression, range: range) =
200+
let store = getStore lexbuf
201+
202+
let expr =
203+
let rec visit (expr: LexerIfdefExpression) : IfDirectiveExpression =
204+
match expr with
205+
| LexerIfdefExpression.IfdefAnd(l,r) -> IfDirectiveExpression.And(visit l, visit r)
206+
| LexerIfdefExpression.IfdefOr(l, r) -> IfDirectiveExpression.Or(visit l, visit r)
207+
| LexerIfdefExpression.IfdefNot e -> IfDirectiveExpression.Not(visit e)
208+
| LexerIfdefExpression.IfdefId id -> IfDirectiveExpression.Ident id
209+
210+
visit expr
211+
212+
let m = mkRangeWithoutLeadingWhitespace lexed range
213+
214+
store.Add(ConditionalDirectiveTrivia.If(expr, m))
215+
216+
let SaveElseHash (lexbuf: Lexbuf, lexed:string, range: range) =
217+
let store = getStore lexbuf
218+
let m = mkRangeWithoutLeadingWhitespace lexed range
219+
store.Add(ConditionalDirectiveTrivia.Else(m))
220+
221+
let SaveEndIfHash (lexbuf: Lexbuf, lexed:string, range: range) =
222+
let store = getStore lexbuf
223+
let m = mkRangeWithoutLeadingWhitespace lexed range
224+
store.Add(ConditionalDirectiveTrivia.EndIf(m))
225+
226+
let GetTrivia (lexbuf: Lexbuf): ConditionalDirectiveTrivia list =
227+
let store = getStore lexbuf
228+
Seq.toList store
229+
180230
//------------------------------------------------------------------------
181231
// Parsing: continuations for whitespace tokens
182232
//------------------------------------------------------------------------

src/fsharp/ParseHelpers.fsi

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,16 @@ type LexerIfdefExpression =
7474

7575
val LexerIfdefEval: lookup:(string -> bool) -> _arg1:LexerIfdefExpression -> bool
7676

77+
module LexbufIfdefStore =
78+
79+
val SaveIfHash: lexbuf:UnicodeLexing.Lexbuf * lexed:string * expr: LexerIfdefExpression * range: range -> unit
80+
81+
val SaveElseHash: lexbuf:UnicodeLexing.Lexbuf * lexed:string * range: range -> unit
82+
83+
val SaveEndIfHash: lexbuf:UnicodeLexing.Lexbuf * lexed:string * range: range -> unit
84+
85+
val GetTrivia: lexbuf:UnicodeLexing.Lexbuf -> SyntaxTrivia.ConditionalDirectiveTrivia list
86+
7787
[<RequireQualifiedAccess>]
7888
type LexerStringStyle =
7989
| Verbatim

src/fsharp/ScriptClosure.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,13 +355,13 @@ module ScriptPreprocessClosure =
355355
match List.frontAndBack closureFiles with
356356
| rest, ClosureFile
357357
(filename, m,
358-
Some(ParsedInput.ImplFile (ParsedImplFileInput (name, isScript, qualNameOfFile, scopedPragmas, hashDirectives, implFileFlags, _))),
358+
Some(ParsedInput.ImplFile (ParsedImplFileInput (name, isScript, qualNameOfFile, scopedPragmas, hashDirectives, implFileFlags, _, trivia))),
359359
parseDiagnostics, metaDiagnostics, nowarns) ->
360360

361361
let isLastCompiland = (true, tcConfig.target.IsExe)
362362
rest @ [ClosureFile
363363
(filename, m,
364-
Some(ParsedInput.ImplFile (ParsedImplFileInput (name, isScript, qualNameOfFile, scopedPragmas, hashDirectives, implFileFlags, isLastCompiland))),
364+
Some(ParsedInput.ImplFile (ParsedImplFileInput (name, isScript, qualNameOfFile, scopedPragmas, hashDirectives, implFileFlags, isLastCompiland, trivia))),
365365
parseDiagnostics, metaDiagnostics, nowarns)]
366366

367367
| _ -> closureFiles

src/fsharp/SyntaxTree.fs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2014,7 +2014,8 @@ type ParsedImplFileInput =
20142014
scopedPragmas: ScopedPragma list *
20152015
hashDirectives: ParsedHashDirective list *
20162016
modules: SynModuleOrNamespace list *
2017-
isLastCompiland: (bool * bool)
2017+
isLastCompiland: (bool * bool) *
2018+
trivia: ParsedImplFileInputTrivia
20182019

20192020
[<NoEquality; NoComparison>]
20202021
type ParsedSigFileInput =
@@ -2023,7 +2024,8 @@ type ParsedSigFileInput =
20232024
qualifiedNameOfFile: QualifiedNameOfFile *
20242025
scopedPragmas: ScopedPragma list *
20252026
hashDirectives: ParsedHashDirective list *
2026-
modules: SynModuleOrNamespaceSig list
2027+
modules: SynModuleOrNamespaceSig list *
2028+
trivia: ParsedSigFileInputTrivia
20272029

20282030
[<NoEquality; NoComparison; RequireQualifiedAccess>]
20292031
type ParsedInput =

src/fsharp/SyntaxTree.fsi

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2207,7 +2207,8 @@ type ParsedImplFileInput =
22072207
scopedPragmas: ScopedPragma list *
22082208
hashDirectives: ParsedHashDirective list *
22092209
modules: SynModuleOrNamespace list *
2210-
isLastCompiland: (bool * bool)
2210+
isLastCompiland: (bool * bool) *
2211+
trivia: ParsedImplFileInputTrivia
22112212

22122213
/// Represents the full syntax tree, file name and other parsing information for a signature file
22132214
[<NoEquality; NoComparison>]
@@ -2217,7 +2218,8 @@ type ParsedSigFileInput =
22172218
qualifiedNameOfFile: QualifiedNameOfFile *
22182219
scopedPragmas: ScopedPragma list *
22192220
hashDirectives: ParsedHashDirective list *
2220-
modules: SynModuleOrNamespaceSig list
2221+
modules: SynModuleOrNamespaceSig list *
2222+
trivia: ParsedSigFileInputTrivia
22212223

22222224
/// Represents the syntax tree for a parsed implementation or signature file
22232225
[<NoEquality; NoComparison; RequireQualifiedAccess>]

src/fsharp/SyntaxTrivia.fs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,26 @@ namespace FSharp.Compiler.SyntaxTrivia
44

55
open FSharp.Compiler.Text
66

7+
[<RequireQualifiedAccess; NoEquality; NoComparison>]
8+
type ConditionalDirectiveTrivia =
9+
| If of expr:IfDirectiveExpression * range:range
10+
| Else of range:range
11+
| EndIf of range:range
12+
13+
and [<RequireQualifiedAccess; NoEquality; NoComparison>] IfDirectiveExpression =
14+
| And of IfDirectiveExpression * IfDirectiveExpression
15+
| Or of IfDirectiveExpression * IfDirectiveExpression
16+
| Not of IfDirectiveExpression
17+
| Ident of string
18+
19+
[<NoEquality; NoComparison>]
20+
type ParsedImplFileInputTrivia =
21+
{ ConditionalDirectives: ConditionalDirectiveTrivia list }
22+
23+
[<NoEquality; NoComparison>]
24+
type ParsedSigFileInputTrivia =
25+
{ ConditionalDirectives: ConditionalDirectiveTrivia list }
26+
727
[<NoEquality; NoComparison>]
828
type SynExprTryWithTrivia =
929
{ TryKeyword: range

src/fsharp/SyntaxTrivia.fsi

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,37 @@
11
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
22

3-
namespace FSharp.Compiler.SyntaxTrivia
3+
namespace rec FSharp.Compiler.SyntaxTrivia
44

55
open FSharp.Compiler.Text
66

7+
[<RequireQualifiedAccess; NoEquality; NoComparison>]
8+
type ConditionalDirectiveTrivia =
9+
| If of expr:IfDirectiveExpression * range:range
10+
| Else of range:range
11+
| EndIf of range:range
12+
13+
type [<RequireQualifiedAccess; NoEquality; NoComparison>] IfDirectiveExpression =
14+
| And of IfDirectiveExpression * IfDirectiveExpression
15+
| Or of IfDirectiveExpression * IfDirectiveExpression
16+
| Not of IfDirectiveExpression
17+
| Ident of string
18+
19+
/// Represents additional information for ParsedImplFileInput
20+
[<NoEquality; NoComparison>]
21+
type ParsedImplFileInputTrivia =
22+
{
23+
/// Preprocessor directives of type #if, #else or #endif
24+
ConditionalDirectives: ConditionalDirectiveTrivia list
25+
}
26+
27+
/// Represents additional information for ParsedSigFileInputTrivia
28+
[<NoEquality; NoComparison>]
29+
type ParsedSigFileInputTrivia =
30+
{
31+
/// Preprocessor directives of type #if, #else or #endif
32+
ConditionalDirectives: ConditionalDirectiveTrivia list
33+
}
34+
735
/// Represents additional information for SynExpr.TryWith
836
[<NoEquality; NoComparison>]
937
type SynExprTryWithTrivia =
@@ -178,4 +206,4 @@ type SynModuleSigDeclNestedModuleTrivia =
178206
/// The syntax range of the `=` token.
179207
EqualsRange: range option
180208
}
181-
static member Zero: SynModuleSigDeclNestedModuleTrivia
209+
static member Zero: SynModuleSigDeclNestedModuleTrivia

0 commit comments

Comments
 (0)