diff --git a/src/Compiler/Checking/CheckExpressions.fs b/src/Compiler/Checking/CheckExpressions.fs index 19d8f2cbaaa..c7dee26d748 100644 --- a/src/Compiler/Checking/CheckExpressions.fs +++ b/src/Compiler/Checking/CheckExpressions.fs @@ -5190,6 +5190,12 @@ and TcExprThen (cenv: cenv) overallTy env tpenv isArg synExpr delayed = match synExpr with + // A. + // A.B. + | SynExpr.DiscardAfterMissingQualificationAfterDot (expr1, _, m) -> + let _, _, tpenv = suppressErrorReporting (fun () -> TcExprOfUnknownTypeThen cenv env tpenv expr1 [DelayedDot]) + mkDefault(m, overallTy.Commit), tpenv + // A // A.B.C | LongOrSingleIdent (isOpt, longId, altNameRefCellOpt, mLongId) -> @@ -5457,7 +5463,8 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE | SynExpr.LongIdent _ | SynExpr.App _ | SynExpr.Dynamic _ - | SynExpr.DotGet _ -> + | SynExpr.DotGet _ + | SynExpr.DiscardAfterMissingQualificationAfterDot _ -> error(Error(FSComp.SR.tcExprUndelayed(), synExpr.Range)) | SynExpr.Const (SynConst.String (s, _, m), _) -> @@ -5602,10 +5609,6 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE //SolveTypeAsError cenv env.DisplayEnv m overallTy mkDefault(m, overallTy.Commit), tpenv - | SynExpr.DiscardAfterMissingQualificationAfterDot (expr1, _, m) -> - let _, _, tpenv = suppressErrorReporting (fun () -> TcExprOfUnknownTypeThen cenv env tpenv expr1 [DelayedDot]) - mkDefault(m, overallTy.Commit), tpenv - | SynExpr.FromParseError (expr1, m) -> //SolveTypeAsError cenv env.DisplayEnv m overallTy let _, tpenv = suppressErrorReporting (fun () -> TcExpr cenv overallTy env tpenv expr1) diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index c5d8c5f53ba..deacc4b66fb 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -373,3 +373,57 @@ let tester2: int Group = [] |> shouldEqual $"int array{rank}d" | other -> Assert.Fail(sprintf "myArr was supposed to be a value, but is %A" other) + + [] + let ``Unfinished long ident type `` () = + let _, checkResults = getParseAndCheckResults """ +let g (s: string) = () + +let f1 a1 a2 a3 a4 = + if true then + a1 + a2 + + a3 + a4 + + g a2 + g a4 + +let f2 b1 b2 b3 b4 b5 = + if true then + b1. + b2. + b5. + + b3. + b4. + + g b2 + g b4 + g b5. +""" + let symbolTypes = + ["a1", Some "unit" + "a2", Some "unit" + "a3", Some "unit" + "a4", Some "unit" + + "b1", None + "b2", Some "string" + "b3", None + "b4", Some "string" + "b5", None] + |> dict + + for symbol in getSymbolUses checkResults |> getSymbols do + match symbol with + | :? FSharpMemberOrFunctionOrValue as mfv -> + match symbolTypes.TryGetValue(mfv.DisplayName) with + | true, Some expectedType -> + mfv.FullType.TypeDefinition.DisplayName |> should equal expectedType + | true, None -> + mfv.FullType.IsGenericParameter |> should equal true + mfv.FullType.AllInterfaces.Count |> should equal 0 + | _ -> () + | _ -> ()