From ed906dbec7f9cb394db49a6d12d4543b7d723cde Mon Sep 17 00:00:00 2001 From: nojaf Date: Thu, 24 Aug 2023 18:35:59 +0200 Subject: [PATCH 1/4] Use dotnet 8 feed. --- paket.dependencies | 4 ++-- paket.lock | 23 ++++++++++--------- .../AbstractClassStubGenerator.fs | 3 ++- src/FsAutoComplete.Core/CodeGeneration.fs | 11 +++++---- src/FsAutoComplete.Core/FCSPatches.fs | 6 +++-- src/FsAutoComplete.Core/Lexer.fs | 2 +- .../ParseAndCheckResults.fs | 1 + src/FsAutoComplete.Core/UntypedAstUtils.fs | 23 +++++++++++++------ 8 files changed, 44 insertions(+), 29 deletions(-) diff --git a/paket.dependencies b/paket.dependencies index e34f8d8f7..fde1e94bf 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -4,7 +4,7 @@ framework: netstandard2.0, netstandard2.1, net6.0, net7.0 source https://api.nuget.org/v3/index.json # this is the FCS nightly feed, re-enable at your own risk! -#source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet7/nuget/v3/index.json +source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json #source: ./libs storage: none strategy: min @@ -13,7 +13,7 @@ lowest_matching: true nuget BenchmarkDotNet 0.13.5 nuget Fantomas.Client >= 0.9 -nuget FSharp.Compiler.Service >= 43.7.400 +nuget FSharp.Compiler.Service >= 43.8.100-preview.23421.4 nuget Ionide.ProjInfo >= 0.62.0 nuget Ionide.ProjInfo.FCS >= 0.62.0 nuget Ionide.ProjInfo.ProjectSystem >= 0.62.0 diff --git a/paket.lock b/paket.lock index 5c1a1cada..737fe5ee6 100644 --- a/paket.lock +++ b/paket.lock @@ -59,22 +59,12 @@ NUGET FSharp.Compiler.Service (>= 41.0.1) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net5.0)) (&& (== netstandard2.1) (>= net5.0)) FSharp.Core (>= 6.0.1) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net5.0)) (&& (== netstandard2.1) (>= net5.0)) McMaster.NETCore.Plugins (>= 1.4) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net5.0)) (&& (== netstandard2.1) (>= net5.0)) - FSharp.Compiler.Service (43.7.400) - FSharp.Core (7.0.400) - System.Buffers (>= 4.5.1) - System.Collections.Immutable (>= 7.0) - System.Diagnostics.DiagnosticSource (>= 7.0.2) - System.Memory (>= 4.5.5) - System.Reflection.Emit (>= 4.7) - System.Reflection.Metadata (>= 7.0) - System.Runtime.CompilerServices.Unsafe (>= 6.0) FSharp.Control.AsyncSeq (3.2.1) FSharp.Core (>= 4.7.2) Microsoft.Bcl.AsyncInterfaces (>= 5.0) FSharp.Control.Reactive (5.0.5) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) FSharp.Core (>= 4.7.2) System.Reactive (>= 5.0 < 6.0) - FSharp.Core (7.0.400) FSharp.Data.Adaptive (1.2.13) FSharp.Core (>= 4.7) System.Reflection.Emit.Lightweight (>= 4.6) @@ -138,7 +128,7 @@ NUGET FSharp.Core (>= 7.0.400) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) Ionide.ProjInfo.Sln (>= 0.62) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) Microsoft.Build (>= 17.2) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) - Microsoft.Build.Framework (>= 17.6.3) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) + Microsoft.Build.Framework (>= 17.2) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) SemanticVersioning (>= 2.0.2) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) Ionide.ProjInfo.FCS (0.62) FSharp.Compiler.Service (>= 43.7.400) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) @@ -489,6 +479,17 @@ NUGET Expecto (>= 9.0 < 10.0) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= netcoreapp3.1)) (&& (== netstandard2.1) (>= netcoreapp3.1)) FSharp.Core (>= 4.6.2) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= netcoreapp3.1)) (&& (== netstandard2.1) (>= netcoreapp3.1)) System.Collections.Immutable (>= 6.0) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= netcoreapp3.1)) (&& (== netstandard2.1) (>= netcoreapp3.1)) + remote: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json + FSharp.Compiler.Service (43.8.100-preview.23421.4) + FSharp.Core (8.0.100-beta.23421.4) + System.Buffers (>= 4.5.1) + System.Collections.Immutable (>= 7.0) + System.Diagnostics.DiagnosticSource (>= 7.0.2) + System.Memory (>= 4.5.5) + System.Reflection.Emit (>= 4.7) + System.Reflection.Metadata (>= 7.0) + System.Runtime.CompilerServices.Unsafe (>= 6.0) + FSharp.Core (8.0.100-beta.23421.4) GROUP Build STORAGE: NONE diff --git a/src/FsAutoComplete.Core/AbstractClassStubGenerator.fs b/src/FsAutoComplete.Core/AbstractClassStubGenerator.fs index ed67a2ed5..bfad5a169 100644 --- a/src/FsAutoComplete.Core/AbstractClassStubGenerator.fs +++ b/src/FsAutoComplete.Core/AbstractClassStubGenerator.fs @@ -29,7 +29,8 @@ type AbstractClassData = let private (|ExplicitCtor|_|) = function - | SynMemberDefn.Member(SynBinding(valData = SynValData(Some({ MemberKind = SynMemberKind.Constructor }), _, _)), _) -> + | SynMemberDefn.Member( + memberDefn = SynBinding(valData = SynValData(memberFlags = Some({ MemberKind = SynMemberKind.Constructor })))) -> Some() | _ -> None diff --git a/src/FsAutoComplete.Core/CodeGeneration.fs b/src/FsAutoComplete.Core/CodeGeneration.fs index 0e3c5ecd3..b21ddb5ae 100644 --- a/src/FsAutoComplete.Core/CodeGeneration.fs +++ b/src/FsAutoComplete.Core/CodeGeneration.fs @@ -631,14 +631,14 @@ module CodeGenerationUtils = /// We also get the range of the leading keyword to establish indent position let (|MemberNamePlusRangeAndKeywordRange|_|) = function - | SynBinding(valData = SynValData(Some mf, _, _); headPat = LongIdentPattern(name, range); trivia = trivia) when + | SynBinding(valData = SynValData(memberFlags = Some mf); headPat = LongIdentPattern(name, range); trivia = trivia) when mf.MemberKind = SynMemberKind.PropertyGet -> if name.StartsWith("get_") then Some(name, range, trivia.LeadingKeyword.Range) else Some("get_" + name, range, trivia.LeadingKeyword.Range) - | SynBinding(valData = SynValData(Some mf, _, _); headPat = LongIdentPattern(name, range); trivia = trivia) when + | SynBinding(valData = SynValData(memberFlags = Some mf); headPat = LongIdentPattern(name, range); trivia = trivia) when mf.MemberKind = SynMemberKind.PropertySet -> if name.StartsWith("set_") then @@ -852,9 +852,10 @@ module CodeGenerationUtils = let rec (|RationalConst|) = function - | SynRationalConst.Integer i -> string i - | SynRationalConst.Rational(numerator, denominator, _) -> sprintf "(%i/%i)" numerator denominator - | SynRationalConst.Negate(RationalConst s) -> sprintf "- %s" s + | SynRationalConst.Integer(value = i) -> string i + | SynRationalConst.Rational(numerator = numerator; denominator = denominator) -> + sprintf "(%i/%i)" numerator denominator + | SynRationalConst.Negate(rationalConst = RationalConst s) -> sprintf "- %s" s let rec (|TypeIdent|_|) = function diff --git a/src/FsAutoComplete.Core/FCSPatches.fs b/src/FsAutoComplete.Core/FCSPatches.fs index 31f8be868..66844a098 100644 --- a/src/FsAutoComplete.Core/FCSPatches.fs +++ b/src/FsAutoComplete.Core/FCSPatches.fs @@ -406,7 +406,8 @@ module SyntaxTreeOps = | SynExpr.YieldOrReturnFrom(_, e, _) | SynExpr.DoBang(e, _) | SynExpr.Fixed(e, _) - | SynExpr.Paren(e, _, _, _) -> walkExpr e + | SynExpr.Paren(e, _, _, _) + | SynExpr.DotLambda(expr = e) -> walkExpr e | SynExpr.NamedIndexedPropertySet(_, e1, e2, _) | SynExpr.DotSet(e1, _, e2, _) @@ -440,7 +441,8 @@ module SyntaxTreeOps = yield! bindings ] | SynExpr.ForEach(enumExpr = e1; bodyExpr = e2) - | SynExpr.While(whileExpr = e1; doExpr = e2) -> walkExpr e1 || walkExpr e2 + | SynExpr.While(whileExpr = e1; doExpr = e2) + | SynExpr.WhileBang(whileExpr = e1; doExpr = e2) -> walkExpr e1 || walkExpr e2 | SynExpr.For(identBody = e1; toBody = e2; doBody = e3) -> walkExpr e1 || walkExpr e2 || walkExpr e3 diff --git a/src/FsAutoComplete.Core/Lexer.fs b/src/FsAutoComplete.Core/Lexer.fs index cc7d503b3..0c5faaf12 100644 --- a/src/FsAutoComplete.Core/Lexer.fs +++ b/src/FsAutoComplete.Core/Lexer.fs @@ -68,7 +68,7 @@ module Lexer = | _ -> defines, langVersion) let sourceTokenizer = - FSharpSourceTokenizer(Seq.toList defines, Some "/tmp.fsx", langVersion) + FSharpSourceTokenizer(Seq.toList defines, Some "/tmp.fsx", langVersion, None) let lineTokenizer = sourceTokenizer.CreateLineTokenizer lineStr diff --git a/src/FsAutoComplete.Core/ParseAndCheckResults.fs b/src/FsAutoComplete.Core/ParseAndCheckResults.fs index 4c820231d..a043c2d46 100644 --- a/src/FsAutoComplete.Core/ParseAndCheckResults.fs +++ b/src/FsAutoComplete.Core/ParseAndCheckResults.fs @@ -645,6 +645,7 @@ type ParseAndCheckResults | CompletionItemKind.Argument -> 4 | CompletionItemKind.Other -> 5 | CompletionItemKind.Method(isExtension = true) -> 6 + | CompletionItemKind.SuggestedName -> 7 let decls = match filter with diff --git a/src/FsAutoComplete.Core/UntypedAstUtils.fs b/src/FsAutoComplete.Core/UntypedAstUtils.fs index c5801ed2b..a03b67447 100644 --- a/src/FsAutoComplete.Core/UntypedAstUtils.fs +++ b/src/FsAutoComplete.Core/UntypedAstUtils.fs @@ -81,9 +81,10 @@ let internal getRangesAtPosition input (r: Position) : Range list = addIfInside attr.Range walkExpr attr.ArgExpr - and walkTyparDecl (SynTyparDecl(attributes = AllAttrs attrs; Item2 = typar)) = + and walkTyparDecl (SynTyparDecl(attributes = AllAttrs attrs; typar = typar; intersectionConstraints = ts)) = List.iter walkAttribute attrs walkTypar typar + List.iter walkType ts and walkTyparDecls (typars: SynTyparDecls) = typars.TyparDecls |> List.iter walkTyparDecl @@ -243,6 +244,9 @@ let internal getRangesAtPosition input (r: Position) : Range list = walkType lhs walkType rhs | SynType.FromParseError(r) -> addIfInside r + | SynType.Intersection(typar = typar; types = ts) -> + Option.iter walkTypar typar + List.iter walkType ts and walkClause (SynMatchClause(pat, e1, e2, r, _, _)) = addIfInside r @@ -307,7 +311,8 @@ let internal getRangesAtPosition input (r: Position) : Range list = List.iter walkExpr es | SynExpr.App(_, _, e1, e2, r) | SynExpr.TryFinally(e1, e2, r, _, _, _) - | SynExpr.While(_, e1, e2, r) -> + | SynExpr.While(_, e1, e2, r) + | SynExpr.WhileBang(_, e1, e2, r) -> addIfInside r List.iter walkExpr [ e1; e2 ] | SynExpr.Record(_, _, fields, r) -> @@ -396,7 +401,7 @@ let internal getRangesAtPosition input (r: Position) : Range list = walkType t walkMemberSig sign walkExpr e - | SynExpr.Const(SynConst.Measure(_, _, m), r) -> + | SynExpr.Const(SynConst.Measure(synMeasure = m), r) -> addIfInside r walkMeasure m | SynExpr.Const(_, r) -> addIfInside r @@ -436,19 +441,23 @@ let internal getRangesAtPosition input (r: Position) : Range list = | SynExpr.Typar(t, r) -> addIfInside r walkTypar t + | SynExpr.DotLambda(expr = e) -> walkExpr e and walkMeasure = function - | SynMeasure.Product(m1, m2, r) - | SynMeasure.Divide(m1, m2, r) -> + | SynMeasure.Product(m1, _, m2, r) -> addIfInside r walkMeasure m1 walkMeasure m2 + | SynMeasure.Divide(m1, _, m2, r) -> + addIfInside r + Option.iter walkMeasure m1 + walkMeasure m2 | SynMeasure.Named(longIdent, r) -> addIfInside r | SynMeasure.Seq(ms, r) -> addIfInside r List.iter walkMeasure ms - | SynMeasure.Power(m, _, r) -> + | SynMeasure.Power(measure = m; range = r) -> addIfInside r walkMeasure m | SynMeasure.Var(ty, r) -> @@ -457,7 +466,7 @@ let internal getRangesAtPosition input (r: Position) : Range list = | SynMeasure.Paren(m, r) -> addIfInside r walkMeasure m - | SynMeasure.One + | SynMeasure.One _ | SynMeasure.Anon _ -> () and walkSimplePat = From 04ef8748f1e3238f074da19d456be65ab0e203be Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 30 Aug 2023 11:33:51 +0200 Subject: [PATCH 2/4] Bump FCS to 43.8.100-preview.23429.1 --- paket.dependencies | 2 +- paket.lock | 6 +++--- src/FsAutoComplete.Core/UnionPatternMatchCaseGenerator.fs | 2 -- src/FsAutoComplete.Core/UntypedAstUtils.fs | 1 - 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/paket.dependencies b/paket.dependencies index fde1e94bf..bf3ba1814 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -13,7 +13,7 @@ lowest_matching: true nuget BenchmarkDotNet 0.13.5 nuget Fantomas.Client >= 0.9 -nuget FSharp.Compiler.Service >= 43.8.100-preview.23421.4 +nuget FSharp.Compiler.Service >= 43.8.100-preview.23429.1 nuget Ionide.ProjInfo >= 0.62.0 nuget Ionide.ProjInfo.FCS >= 0.62.0 nuget Ionide.ProjInfo.ProjectSystem >= 0.62.0 diff --git a/paket.lock b/paket.lock index 737fe5ee6..f4db632d1 100644 --- a/paket.lock +++ b/paket.lock @@ -480,8 +480,8 @@ NUGET FSharp.Core (>= 4.6.2) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= netcoreapp3.1)) (&& (== netstandard2.1) (>= netcoreapp3.1)) System.Collections.Immutable (>= 6.0) - restriction: || (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= netcoreapp3.1)) (&& (== netstandard2.1) (>= netcoreapp3.1)) remote: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json - FSharp.Compiler.Service (43.8.100-preview.23421.4) - FSharp.Core (8.0.100-beta.23421.4) + FSharp.Compiler.Service (43.8.100-preview.23429.1) + FSharp.Core (8.0.100-beta.23429.1) System.Buffers (>= 4.5.1) System.Collections.Immutable (>= 7.0) System.Diagnostics.DiagnosticSource (>= 7.0.2) @@ -489,7 +489,7 @@ NUGET System.Reflection.Emit (>= 4.7) System.Reflection.Metadata (>= 7.0) System.Runtime.CompilerServices.Unsafe (>= 6.0) - FSharp.Core (8.0.100-beta.23421.4) + FSharp.Core (8.0.100-beta.23429.1) GROUP Build STORAGE: NONE diff --git a/src/FsAutoComplete.Core/UnionPatternMatchCaseGenerator.fs b/src/FsAutoComplete.Core/UnionPatternMatchCaseGenerator.fs index 84ee01ce2..37006bd16 100644 --- a/src/FsAutoComplete.Core/UnionPatternMatchCaseGenerator.fs +++ b/src/FsAutoComplete.Core/UnionPatternMatchCaseGenerator.fs @@ -60,7 +60,6 @@ let private clauseIsCandidateForCodeGen (cursorPos: Position) (SynMatchClause(pa | SynPat.Null _ | SynPat.IsInst _ | SynPat.QuoteExpr _ - | SynPat.DeprecatedCharRange _ | SynPat.InstanceMember _ | SynPat.FromParseError _ | SynPat.As _ @@ -307,7 +306,6 @@ let getWrittenCases (patMatchExpr: PatternMatchExpr) = | SynPat.InstanceMember(_, _, _, _, _) | SynPat.IsInst(_, _) | SynPat.QuoteExpr(_, _) - | SynPat.DeprecatedCharRange(_, _, _) | SynPat.ListCons _ | SynPat.FromParseError(_, _) -> false diff --git a/src/FsAutoComplete.Core/UntypedAstUtils.fs b/src/FsAutoComplete.Core/UntypedAstUtils.fs index a03b67447..664eda6bb 100644 --- a/src/FsAutoComplete.Core/UntypedAstUtils.fs +++ b/src/FsAutoComplete.Core/UntypedAstUtils.fs @@ -157,7 +157,6 @@ let internal getRangesAtPosition input (r: Position) : Range list = | SynPat.Record(_, r) -> addIfInside r | SynPat.Null(r) -> addIfInside r | SynPat.OptionalVal(_, r) -> addIfInside r - | SynPat.DeprecatedCharRange(_, _, r) -> addIfInside r | SynPat.InstanceMember(_, _, _, accessibility, r) -> addIfInside r | SynPat.FromParseError(_, r) -> addIfInside r | SynPat.As(lpat, rpat, r) -> From 379bd2f3e97b88d08857cdc151a725586952783c Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 30 Aug 2023 13:32:29 +0200 Subject: [PATCH 3/4] Use setter symbol when current symbol is a property. --- src/FsAutoComplete.Core/ParseAndCheckResults.fs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/FsAutoComplete.Core/ParseAndCheckResults.fs b/src/FsAutoComplete.Core/ParseAndCheckResults.fs index a043c2d46..eba51fe36 100644 --- a/src/FsAutoComplete.Core/ParseAndCheckResults.fs +++ b/src/FsAutoComplete.Core/ParseAndCheckResults.fs @@ -539,6 +539,14 @@ type ParseAndCheckResults if symbol.IsPropertyGetterMethod then Ok(typ, [], []) else + let symbol = + // Symbol is a property with both get and set. + // Take the setter symbol in this case. + if symbol.HasGetterMethod && symbol.HasSetterMethod then + symbol.SetterMethod + else + symbol + let parms = symbol.CurriedParameterGroups |> Seq.map ( From 0ec732b4c3b978e54e5f38e3f0d4955ecbe043c5 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 30 Aug 2023 13:46:13 +0200 Subject: [PATCH 4/4] Update error code for AddMissingEqualsToTypeDefinition. --- .../CodeFixes/AddMissingEqualsToTypeDefinition.fs | 2 +- test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/FsAutoComplete/CodeFixes/AddMissingEqualsToTypeDefinition.fs b/src/FsAutoComplete/CodeFixes/AddMissingEqualsToTypeDefinition.fs index ff7a8ec0c..9b933ccb7 100644 --- a/src/FsAutoComplete/CodeFixes/AddMissingEqualsToTypeDefinition.fs +++ b/src/FsAutoComplete/CodeFixes/AddMissingEqualsToTypeDefinition.fs @@ -11,7 +11,7 @@ let title = "Add missing '=' to type definition" /// a codefix that adds in missing '=' characters in type declarations let fix (getFileLines: GetFileLines) = - Run.ifDiagnosticByCode (Set.ofList [ "3360" ]) (fun diagnostic codeActionParams -> + Run.ifDiagnosticByCode (Set.ofList [ "10" ]) (fun diagnostic codeActionParams -> asyncResult { let fileName = codeActionParams.TextDocument.GetFilePath() |> Utils.normalizePath diff --git a/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs b/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs index 9230d36a8..c5edbac6e 100644 --- a/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs +++ b/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs @@ -17,7 +17,7 @@ let private addMissingEqualsToTypeDefinitionTests state = """ type Person $0{ Name : string; Age : int; City : string } """ - (Diagnostics.expectCode "3360") + (Diagnostics.expectCode "10") selectCodeFix """ type Person = { Name : string; Age : int; City : string } @@ -29,7 +29,7 @@ let private addMissingEqualsToTypeDefinitionTests state = """ type Name $0Name of string """ - (Diagnostics.expectCode "3360") + (Diagnostics.expectCode "10") selectCodeFix """ type Name = Name of string