Skip to content

Commit e668b90

Browse files
authored
Add trivia to Nullness nodes in SyntaxTree. (#17745)
1 parent 006f91e commit e668b90

30 files changed

+178
-94
lines changed

docs/release-notes/.FSharp.Compiler.Service/9.0.100.md

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
* Enable LanguageFeature.EnforceAttributeTargets in F# 9.0. ([Issue #17514](https://github.com/dotnet/fsharp/issues/17558), [PR #17516](https://github.com/dotnet/fsharp/pull/17558))
3838
* Parser: better recovery for unfinished patterns ([PR #17231](https://github.com/dotnet/fsharp/pull/17231), [PR #17232](https://github.com/dotnet/fsharp/pull/17232)))
3939
* Enable consuming generic arguments defined as `allows ref struct` in C# ([Issue #17597](https://github.com/dotnet/fsharp/issues/17597)
40+
* Trivia for SynTypeConstraint.WhereTyparNotSupportsNull. ([Issue #17721](https://github.com/dotnet/fsharp/issues/17721), [PR #17745](https://github.com/dotnet/fsharp/pull/17745))
41+
* Trivia for SynType.WithNull. ([Issue #17720](https://github.com/dotnet/fsharp/issues/17720), [PR #17745](https://github.com/dotnet/fsharp/pull/17745))
4042

4143
### Changed
4244

src/Compiler/Checking/Expressions/CheckExpressions.fs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4028,7 +4028,7 @@ let rec TcTyparConstraint ridx (cenv: cenv) newOk checkConstraints occ (env: TcE
40284028
| SynTypeConstraint.WhereTyparSupportsNull(tp, m) ->
40294029
TcSimpleTyparConstraint cenv env newOk tpenv tp m AddCxTypeUseSupportsNull
40304030

4031-
| SynTypeConstraint.WhereTyparNotSupportsNull(tp, m) ->
4031+
| SynTypeConstraint.WhereTyparNotSupportsNull(tp, m, _) ->
40324032
if g.langFeatureNullness then
40334033
TcSimpleTyparConstraint cenv env newOk tpenv tp m AddCxTypeDefnNotSupportsNull
40344034
else
@@ -4472,7 +4472,7 @@ and TcTypeOrMeasure kindOpt (cenv: cenv) newOk checkConstraints occ (iwsam: Warn
44724472
errorR(Error(FSComp.SR.parsInvalidLiteralInType(), m))
44734473
NewErrorType (), tpenv
44744474

4475-
| SynType.WithNull(innerTy, ambivalent, m) ->
4475+
| SynType.WithNull(innerTy, ambivalent, m, _) ->
44764476
let innerTyC, tpenv = TcTypeAndRecover cenv newOk checkConstraints occ WarnOnIWSAM.Yes env tpenv innerTy
44774477
let nullness = if ambivalent then KnownAmbivalentToNull else KnownWithNull
44784478
let tyWithNull = TcAddNullnessToType false cenv env nullness innerTyC m

src/Compiler/Service/ServiceParseTreeWalk.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -838,7 +838,7 @@ module SyntaxTraversal =
838838
| SynType.Fun(argType = ty1; returnType = ty2) -> [ ty1; ty2 ] |> List.tryPick (traverseSynType path)
839839
| SynType.MeasurePower(ty, _, _)
840840
| SynType.HashConstraint(ty, _)
841-
| SynType.WithNull(ty, _, _)
841+
| SynType.WithNull(innerType = ty)
842842
| SynType.WithGlobalConstraints(ty, _, _)
843843
| SynType.Array(_, ty, _) -> traverseSynType path ty
844844
| SynType.StaticConstantNamed(ty1, ty2, _)

src/Compiler/Service/ServiceParsedInputOps.fs

+4-4
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ module ParsedInput =
647647
| SynTypeConstraint.WhereTyparIsReferenceType(t, _) -> walkTypar t
648648
| SynTypeConstraint.WhereTyparIsUnmanaged(t, _) -> walkTypar t
649649
| SynTypeConstraint.WhereTyparSupportsNull(t, _) -> walkTypar t
650-
| SynTypeConstraint.WhereTyparNotSupportsNull(t, _) -> walkTypar t
650+
| SynTypeConstraint.WhereTyparNotSupportsNull(genericName = t) -> walkTypar t
651651
| SynTypeConstraint.WhereTyparIsComparable(t, _) -> walkTypar t
652652
| SynTypeConstraint.WhereTyparIsEquatable(t, _) -> walkTypar t
653653
| SynTypeConstraint.WhereTyparSubtypeOfType(t, ty, _) -> walkTypar t |> Option.orElseWith (fun () -> walkType ty)
@@ -711,7 +711,7 @@ module ParsedInput =
711711
| SynType.Array(_, t, _) -> walkType t
712712
| SynType.Fun(argType = t1; returnType = t2) -> walkType t1 |> Option.orElseWith (fun () -> walkType t2)
713713
| SynType.WithGlobalConstraints(t, _, _) -> walkType t
714-
| SynType.WithNull(t, _, _)
714+
| SynType.WithNull(innerType = t)
715715
| SynType.HashConstraint(t, _) -> walkType t
716716
| SynType.Or(t1, t2, _, _) -> walkType t1 |> Option.orElseWith (fun () -> walkType t2)
717717
| SynType.MeasurePower(t, _, _) -> walkType t
@@ -1914,7 +1914,7 @@ module ParsedInput =
19141914
| SynTypeConstraint.WhereTyparIsReferenceType(t, _)
19151915
| SynTypeConstraint.WhereTyparIsUnmanaged(t, _)
19161916
| SynTypeConstraint.WhereTyparSupportsNull(t, _)
1917-
| SynTypeConstraint.WhereTyparNotSupportsNull(t, _)
1917+
| SynTypeConstraint.WhereTyparNotSupportsNull(genericName = t)
19181918
| SynTypeConstraint.WhereTyparIsComparable(t, _)
19191919
| SynTypeConstraint.WhereTyparIsEquatable(t, _) -> walkTypar t
19201920
| SynTypeConstraint.WhereTyparDefaultsToType(t, ty, _)
@@ -1976,7 +1976,7 @@ module ParsedInput =
19761976
| SynType.Array(_, t, _)
19771977
| SynType.HashConstraint(t, _)
19781978
| SynType.MeasurePower(t, _, _)
1979-
| SynType.WithNull(t, _, _)
1979+
| SynType.WithNull(innerType = t)
19801980
| SynType.Paren(t, _)
19811981
| SynType.SignatureParameter(usedType = t) -> walkType t
19821982
| SynType.Fun(argType = t1; returnType = t2)

src/Compiler/SyntaxTree/SyntaxTree.fs

+2-2
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ type SynTypeConstraint =
332332

333333
| WhereTyparSupportsNull of typar: SynTypar * range: range
334334

335-
| WhereTyparNotSupportsNull of genericName: SynTypar * range: range
335+
| WhereTyparNotSupportsNull of genericName: SynTypar * range: range * trivia: SynTypeConstraintWhereTyparNotSupportsNullTrivia
336336

337337
| WhereTyparIsComparable of typar: SynTypar * range: range
338338

@@ -465,7 +465,7 @@ type SynType =
465465

466466
| StaticConstantNamed of ident: SynType * value: SynType * range: range
467467

468-
| WithNull of innerType: SynType * ambivalent: bool * range: range
468+
| WithNull of innerType: SynType * ambivalent: bool * range: range * trivia: SynTypeWithNullTrivia
469469

470470
| Paren of innerType: SynType * range: range
471471

src/Compiler/SyntaxTree/SyntaxTree.fsi

+5-2
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,10 @@ type SynTypeConstraint =
409409
| WhereTyparSupportsNull of typar: SynTypar * range: range
410410

411411
/// F# syntax is 'typar : null
412-
| WhereTyparNotSupportsNull of genericName: SynTypar * range: range
412+
| WhereTyparNotSupportsNull of
413+
genericName: SynTypar *
414+
range: range *
415+
trivia: SynTypeConstraintWhereTyparNotSupportsNullTrivia
413416

414417
/// F# syntax is 'typar: comparison
415418
| WhereTyparIsComparable of typar: SynTypar * range: range
@@ -527,7 +530,7 @@ type SynType =
527530
/// F# syntax: ident=1 etc., used in static parameters to type providers
528531
| StaticConstantNamed of ident: SynType * value: SynType * range: range
529532

530-
| WithNull of innerType: SynType * ambivalent: bool * range: range
533+
| WithNull of innerType: SynType * ambivalent: bool * range: range * trivia: SynTypeWithNullTrivia
531534

532535
| Paren of innerType: SynType * range: range
533536

src/Compiler/SyntaxTree/SyntaxTrivia.fs

+6
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,9 @@ type SynFieldTrivia =
404404
[<NoEquality; NoComparison>]
405405
type SynTypeOrTrivia = { OrKeyword: range }
406406

407+
[<NoEquality; NoComparison>]
408+
type SynTypeWithNullTrivia = { BarRange: range }
409+
407410
[<NoEquality; NoComparison>]
408411
type SynBindingReturnInfoTrivia = { ColonRange: range option }
409412

@@ -429,3 +432,6 @@ type SynMeasureConstantTrivia =
429432
LessRange: range
430433
GreaterRange: range
431434
}
435+
436+
[<NoEquality; NoComparison>]
437+
type SynTypeConstraintWhereTyparNotSupportsNullTrivia = { ColonRange: range; NotRange: range }

src/Compiler/SyntaxTree/SyntaxTrivia.fsi

+19
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,14 @@ type SynTypeOrTrivia =
512512
OrKeyword: range
513513
}
514514

515+
/// Represents additional information for SynType.WithNull
516+
[<NoEquality; NoComparison>]
517+
type SynTypeWithNullTrivia =
518+
{
519+
/// The syntax range of the `|` token
520+
BarRange: range
521+
}
522+
515523
/// Represents additional information for SynBindingReturnInfo
516524
[<NoEquality; NoComparison>]
517525
type SynBindingReturnInfoTrivia =
@@ -545,3 +553,14 @@ type SynTyparDeclTrivia =
545553
type SynMeasureConstantTrivia =
546554
{ LessRange: range
547555
GreaterRange: range }
556+
557+
/// Represents additional information for SynTypeConstraint.WhereTyparNotSupportsNull
558+
[<NoEquality; NoComparison>]
559+
type SynTypeConstraintWhereTyparNotSupportsNullTrivia =
560+
{
561+
/// The syntax range of `:`
562+
ColonRange: range
563+
564+
/// The syntax range of `not`
565+
NotRange: range
566+
}

src/Compiler/pars.fsy

+5-4
Original file line numberDiff line numberDiff line change
@@ -2652,8 +2652,9 @@ typeConstraint:
26522652
{ SynTypeConstraint.WhereTyparSupportsNull($1, lhs parseState) }
26532653

26542654
| typar COLON IDENT NULL
2655-
{ if $3 <> "not" then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier($3 + " (2)"))
2656-
SynTypeConstraint.WhereTyparNotSupportsNull($1, lhs parseState) }
2655+
{ if $3 <> "not" then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier($3 + " (2)"))
2656+
let trivia : SynTypeConstraintWhereTyparNotSupportsNullTrivia = { ColonRange = rhs parseState 2; NotRange = rhs parseState 3 }
2657+
SynTypeConstraint.WhereTyparNotSupportsNull($1, lhs parseState, trivia) }
26572658

26582659
| typar COLON LPAREN classMemberSpfn rparen
26592660
{ let tp = $1
@@ -3241,7 +3242,7 @@ cType:
32413242
SynType.App(SynType.LongIdent(SynLongIdent([ident("nativeptr", m)], [], [ Some(IdentTrivia.OriginalNotation "*") ])), None, [$1], [], None, true, m) }
32423243

32433244
| cType BAR_JUST_BEFORE_NULL NULL
3244-
{ SynType.WithNull($1, false, lhs parseState) }
3245+
{ SynType.WithNull($1, false, lhs parseState, { BarRange = rhs parseState 2 }) }
32453246

32463247
| cType AMP
32473248
{ let m = lhs parseState
@@ -6193,7 +6194,7 @@ appTypeConPower:
61936194

61946195
appTypeCanBeNullable:
61956196
| appTypeWithoutNull BAR_JUST_BEFORE_NULL NULL
6196-
{ SynType.WithNull($1, false, lhs parseState) }
6197+
{ SynType.WithNull($1, false, lhs parseState, { BarRange = rhs parseState 2 }) }
61976198

61986199
| appTypeWithoutNull
61996200
{ $1 }

tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl

+16-2
Original file line numberDiff line numberDiff line change
@@ -9197,6 +9197,8 @@ FSharp.Compiler.Syntax.SynType+WithNull: Boolean ambivalent
91979197
FSharp.Compiler.Syntax.SynType+WithNull: Boolean get_ambivalent()
91989198
FSharp.Compiler.Syntax.SynType+WithNull: FSharp.Compiler.Syntax.SynType get_innerType()
91999199
FSharp.Compiler.Syntax.SynType+WithNull: FSharp.Compiler.Syntax.SynType innerType
9200+
FSharp.Compiler.Syntax.SynType+WithNull: FSharp.Compiler.SyntaxTrivia.SynTypeWithNullTrivia get_trivia()
9201+
FSharp.Compiler.Syntax.SynType+WithNull: FSharp.Compiler.SyntaxTrivia.SynTypeWithNullTrivia trivia
92009202
FSharp.Compiler.Syntax.SynType+WithNull: FSharp.Compiler.Text.Range get_range()
92019203
FSharp.Compiler.Syntax.SynType+WithNull: FSharp.Compiler.Text.Range range
92029204
FSharp.Compiler.Syntax.SynType: Boolean IsAnon
@@ -9264,7 +9266,7 @@ FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewStaticConstant
92649266
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewTuple(Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynTupleTypeSegment], FSharp.Compiler.Text.Range)
92659267
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewVar(FSharp.Compiler.Syntax.SynTypar, FSharp.Compiler.Text.Range)
92669268
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewWithGlobalConstraints(FSharp.Compiler.Syntax.SynType, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynTypeConstraint], FSharp.Compiler.Text.Range)
9267-
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewWithNull(FSharp.Compiler.Syntax.SynType, Boolean, FSharp.Compiler.Text.Range)
9269+
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType NewWithNull(FSharp.Compiler.Syntax.SynType, Boolean, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynTypeWithNullTrivia)
92689270
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+Anon
92699271
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+AnonRecd
92709272
FSharp.Compiler.Syntax.SynType: FSharp.Compiler.Syntax.SynType+App
@@ -9350,6 +9352,8 @@ FSharp.Compiler.Syntax.SynTypeConstraint+WhereTyparIsValueType: FSharp.Compiler.
93509352
FSharp.Compiler.Syntax.SynTypeConstraint+WhereTyparIsValueType: FSharp.Compiler.Text.Range range
93519353
FSharp.Compiler.Syntax.SynTypeConstraint+WhereTyparNotSupportsNull: FSharp.Compiler.Syntax.SynTypar genericName
93529354
FSharp.Compiler.Syntax.SynTypeConstraint+WhereTyparNotSupportsNull: FSharp.Compiler.Syntax.SynTypar get_genericName()
9355+
FSharp.Compiler.Syntax.SynTypeConstraint+WhereTyparNotSupportsNull: FSharp.Compiler.SyntaxTrivia.SynTypeConstraintWhereTyparNotSupportsNullTrivia get_trivia()
9356+
FSharp.Compiler.Syntax.SynTypeConstraint+WhereTyparNotSupportsNull: FSharp.Compiler.SyntaxTrivia.SynTypeConstraintWhereTyparNotSupportsNullTrivia trivia
93539357
FSharp.Compiler.Syntax.SynTypeConstraint+WhereTyparNotSupportsNull: FSharp.Compiler.Text.Range get_range()
93549358
FSharp.Compiler.Syntax.SynTypeConstraint+WhereTyparNotSupportsNull: FSharp.Compiler.Text.Range range
93559359
FSharp.Compiler.Syntax.SynTypeConstraint+WhereTyparSubtypeOfType: FSharp.Compiler.Syntax.SynTypar get_typar()
@@ -9403,7 +9407,7 @@ FSharp.Compiler.Syntax.SynTypeConstraint: FSharp.Compiler.Syntax.SynTypeConstrai
94039407
FSharp.Compiler.Syntax.SynTypeConstraint: FSharp.Compiler.Syntax.SynTypeConstraint NewWhereTyparIsReferenceType(FSharp.Compiler.Syntax.SynTypar, FSharp.Compiler.Text.Range)
94049408
FSharp.Compiler.Syntax.SynTypeConstraint: FSharp.Compiler.Syntax.SynTypeConstraint NewWhereTyparIsUnmanaged(FSharp.Compiler.Syntax.SynTypar, FSharp.Compiler.Text.Range)
94059409
FSharp.Compiler.Syntax.SynTypeConstraint: FSharp.Compiler.Syntax.SynTypeConstraint NewWhereTyparIsValueType(FSharp.Compiler.Syntax.SynTypar, FSharp.Compiler.Text.Range)
9406-
FSharp.Compiler.Syntax.SynTypeConstraint: FSharp.Compiler.Syntax.SynTypeConstraint NewWhereTyparNotSupportsNull(FSharp.Compiler.Syntax.SynTypar, FSharp.Compiler.Text.Range)
9410+
FSharp.Compiler.Syntax.SynTypeConstraint: FSharp.Compiler.Syntax.SynTypeConstraint NewWhereTyparNotSupportsNull(FSharp.Compiler.Syntax.SynTypar, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynTypeConstraintWhereTyparNotSupportsNullTrivia)
94079411
FSharp.Compiler.Syntax.SynTypeConstraint: FSharp.Compiler.Syntax.SynTypeConstraint NewWhereTyparSubtypeOfType(FSharp.Compiler.Syntax.SynTypar, FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range)
94089412
FSharp.Compiler.Syntax.SynTypeConstraint: FSharp.Compiler.Syntax.SynTypeConstraint NewWhereTyparSupportsMember(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Syntax.SynMemberSig, FSharp.Compiler.Text.Range)
94099413
FSharp.Compiler.Syntax.SynTypeConstraint: FSharp.Compiler.Syntax.SynTypeConstraint NewWhereTyparSupportsNull(FSharp.Compiler.Syntax.SynTypar, FSharp.Compiler.Text.Range)
@@ -10573,6 +10577,12 @@ FSharp.Compiler.SyntaxTrivia.SynTyparDeclTrivia: Microsoft.FSharp.Collections.FS
1057310577
FSharp.Compiler.SyntaxTrivia.SynTyparDeclTrivia: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Text.Range] get_AmpersandRanges()
1057410578
FSharp.Compiler.SyntaxTrivia.SynTyparDeclTrivia: System.String ToString()
1057510579
FSharp.Compiler.SyntaxTrivia.SynTyparDeclTrivia: Void .ctor(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Text.Range])
10580+
FSharp.Compiler.SyntaxTrivia.SynTypeConstraintWhereTyparNotSupportsNullTrivia: FSharp.Compiler.Text.Range ColonRange
10581+
FSharp.Compiler.SyntaxTrivia.SynTypeConstraintWhereTyparNotSupportsNullTrivia: FSharp.Compiler.Text.Range NotRange
10582+
FSharp.Compiler.SyntaxTrivia.SynTypeConstraintWhereTyparNotSupportsNullTrivia: FSharp.Compiler.Text.Range get_ColonRange()
10583+
FSharp.Compiler.SyntaxTrivia.SynTypeConstraintWhereTyparNotSupportsNullTrivia: FSharp.Compiler.Text.Range get_NotRange()
10584+
FSharp.Compiler.SyntaxTrivia.SynTypeConstraintWhereTyparNotSupportsNullTrivia: System.String ToString()
10585+
FSharp.Compiler.SyntaxTrivia.SynTypeConstraintWhereTyparNotSupportsNullTrivia: Void .ctor(FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range)
1057610586
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+And: FSharp.Compiler.Text.Range Item
1057710587
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+And: FSharp.Compiler.Text.Range get_Item()
1057810588
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+StaticType: FSharp.Compiler.Text.Range get_staticRange()
@@ -10635,6 +10645,10 @@ FSharp.Compiler.SyntaxTrivia.SynTypeOrTrivia: FSharp.Compiler.Text.Range OrKeywo
1063510645
FSharp.Compiler.SyntaxTrivia.SynTypeOrTrivia: FSharp.Compiler.Text.Range get_OrKeyword()
1063610646
FSharp.Compiler.SyntaxTrivia.SynTypeOrTrivia: System.String ToString()
1063710647
FSharp.Compiler.SyntaxTrivia.SynTypeOrTrivia: Void .ctor(FSharp.Compiler.Text.Range)
10648+
FSharp.Compiler.SyntaxTrivia.SynTypeWithNullTrivia: FSharp.Compiler.Text.Range BarRange
10649+
FSharp.Compiler.SyntaxTrivia.SynTypeWithNullTrivia: FSharp.Compiler.Text.Range get_BarRange()
10650+
FSharp.Compiler.SyntaxTrivia.SynTypeWithNullTrivia: System.String ToString()
10651+
FSharp.Compiler.SyntaxTrivia.SynTypeWithNullTrivia: Void .ctor(FSharp.Compiler.Text.Range)
1063810652
FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] BarRange
1063910653
FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_BarRange()
1064010654
FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia: System.String ToString()

0 commit comments

Comments
 (0)