Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 39 additions & 38 deletions src/fsharp/CheckComputationExpressions.fs

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions src/fsharp/CheckDeclarations.fs
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@ module TcRecdUnionAndEnumDeclarations =
| _ ->
seen.Add(f.LogicalName, sf))

let TcUnionCaseDecl cenv env parent thisTy thisTyInst tpenv (SynUnionCase(Attributes synAttrs, id, args, xmldoc, vis, m)) =
let TcUnionCaseDecl cenv env parent thisTy thisTyInst tpenv (SynUnionCase(Attributes synAttrs, id, args, xmldoc, vis, m, _)) =
let attrs = TcAttributes cenv env AttributeTargets.UnionCaseDecl synAttrs // the attributes of a union case decl get attached to the generated "static factory" method
let vis, _ = ComputeAccessAndCompPath env None m vis None parent
let vis = CombineReprAccess parent vis
Expand Down Expand Up @@ -2911,7 +2911,7 @@ let CheckForDuplicateModule env nm m =
/// Check 'exception' declarations in implementations and signatures
module TcExceptionDeclarations =

let TcExnDefnCore_Phase1A cenv env parent (SynExceptionDefnRepr(Attributes synAttrs, SynUnionCase(_, id, _, _, _, _), _, doc, vis, m)) =
let TcExnDefnCore_Phase1A cenv env parent (SynExceptionDefnRepr(Attributes synAttrs, SynUnionCase(ident=id), _, doc, vis, m)) =
let attrs = TcAttributes cenv env AttributeTargets.ExnDecl synAttrs
if not (String.isLeadingIdentifierCharacterUpperCase id.idText) then errorR(NotUpperCaseConstructor m)
let vis, cpath = ComputeAccessAndCompPath env None m vis None parent
Expand All @@ -2922,7 +2922,7 @@ module TcExceptionDeclarations =
let doc = doc.ToXmlDoc(true, Some [])
Construct.NewExn cpath id vis repr attrs doc

let TcExnDefnCore_Phase1G_EstablishRepresentation (cenv: cenv) (env: TcEnv) parent (exnc: Entity) (SynExceptionDefnRepr(_, SynUnionCase(_, _, args, _, _, _), reprIdOpt, _, _, m)) =
let TcExnDefnCore_Phase1G_EstablishRepresentation (cenv: cenv) (env: TcEnv) parent (exnc: Entity) (SynExceptionDefnRepr(_, SynUnionCase(caseType=args), reprIdOpt, _, _, m)) =
let g = cenv.g
let args = match args with SynUnionCaseKind.Fields args -> args | _ -> error(Error(FSComp.SR.tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors(), m))
let ad = env.AccessRights
Expand Down Expand Up @@ -3111,7 +3111,7 @@ module EstablishTypeDefinitionCores =
| SynTypeDefnSimpleRepr.None _ -> ()
| SynTypeDefnSimpleRepr.Union (_, unionCases, _) ->

for SynUnionCase (_, _, args, _, _, m) in unionCases do
for SynUnionCase (caseType=args; range=m) in unionCases do
match args with
| SynUnionCaseKind.Fields flds ->
for SynField(_, _, _, ty, _, _, _, m) in flds do
Expand Down Expand Up @@ -5225,7 +5225,7 @@ and TcSignatureElementsMutRec cenv parent typeNames m mutRecNSInfo envInitial (d
decls, (openOk, moduleAbbrevOk)

| SynModuleSigDecl.Exception (exnSig=SynExceptionSig(exnRepr=exnRepr; withKeyword=withKeyword; members=members)) ->
let ( SynExceptionDefnRepr(synAttrs, SynUnionCase(_, id, _args, _, _, _), _, doc, vis, m)) = exnRepr
let ( SynExceptionDefnRepr(synAttrs, SynUnionCase(ident=id), _, doc, vis, m)) = exnRepr
let compInfo = SynComponentInfo(synAttrs, None, [], [id], doc, false, vis, id.idRange)
let decls = [ MutRecShape.Tycon(SynTypeDefnSig.SynTypeDefnSig(compInfo, None, SynTypeDefnSigRepr.Exception exnRepr, withKeyword, members, m)) ]
decls, (false, false)
Expand Down Expand Up @@ -5562,7 +5562,7 @@ and TcModuleOrNamespaceElementsMutRec (cenv: cenv) parent typeNames m envInitial
decls, (openOk, moduleAbbrevOk, attrs)

| SynModuleDecl.Exception (SynExceptionDefn(repr, _, members, _), _m) ->
let (SynExceptionDefnRepr(synAttrs, SynUnionCase(_, id, _args, _, _, _), _repr, doc, vis, m)) = repr
let (SynExceptionDefnRepr(synAttrs, SynUnionCase(ident=id), _repr, doc, vis, m)) = repr
let compInfo = SynComponentInfo(synAttrs, None, [], [id], doc, false, vis, id.idRange)
let decls = [ MutRecShape.Tycon(SynTypeDefn(compInfo, None, SynTypeDefnRepr.Exception repr, None, members, None, m)) ]
decls, (false, false, attrs)
Expand Down
24 changes: 12 additions & 12 deletions src/fsharp/CheckExpressions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2559,7 +2559,7 @@ module EventDeclarationNormalization =

match rhsExpr with
// Detect 'fun () -> e' which results from the compilation of a property getter
| SynExpr.Lambda (_, _, SynSimplePats.SimplePats([], _), _, trueRhsExpr, _, m) ->
| SynExpr.Lambda (args=SynSimplePats.SimplePats([], _); body=trueRhsExpr; range=m) ->
let rhsExpr = mkSynApp1 (SynExpr.DotGet (SynExpr.Paren (trueRhsExpr, range0, None, m), range0, LongIdentWithDots([ident(target, m)], []), m)) (SynExpr.Ident (ident(argName, m))) m

// reconstitute rhsExpr
Expand Down Expand Up @@ -5766,10 +5766,10 @@ and TcExprUndelayed cenv (overallTy: OverallTy) env tpenv (synExpr: SynExpr) =
| SynExpr.LetOrUse _ ->
TcLinearExprs (TcExprThatCanBeCtorBody cenv) cenv env overallTy tpenv false synExpr (fun x -> x)

| SynExpr.TryWith (_mTry, synBodyExpr, _mTryToWith, _mWith, synWithClauses, mWithToLast, mTryToLast, spTry, spWith) ->
TcExprTryWith cenv overallTy env tpenv (synBodyExpr, _mTryToWith, synWithClauses, mWithToLast, mTryToLast, spTry, spWith)
| SynExpr.TryWith (synBodyExpr, synWithClauses, mTryToLast, spTry, spWith, trivia) ->
TcExprTryWith cenv overallTy env tpenv (synBodyExpr, synWithClauses, trivia.WithToEndRange, mTryToLast, spTry, spWith)

| SynExpr.TryFinally (synBodyExpr, synFinallyExpr, mTryToLast, spTry, spFinally) ->
| SynExpr.TryFinally (synBodyExpr, synFinallyExpr, mTryToLast, spTry, spFinally, _trivia) ->
TcExprTryFinally cenv overallTy env tpenv (synBodyExpr, synFinallyExpr, mTryToLast, spTry, spFinally)

| SynExpr.JoinIn (e1, mInToken, e2, mAll) ->
Expand Down Expand Up @@ -6036,14 +6036,14 @@ and TcExprIntegerForLoop cenv overallTy env tpenv (spBind, id, start, dir, finis
let bodyExpr, tpenv = TcStmt cenv envinner tpenv body
mkFastForLoop cenv.g (spBind, m, idv, startExpr, dir, finishExpr, bodyExpr), tpenv

and TcExprTryWith cenv overallTy env tpenv (synBodyExpr, _mTryToWith, synWithClauses, mWithToLast, mTryToLast, spTry, spWith) =
and TcExprTryWith cenv overallTy env tpenv (synBodyExpr, synWithClauses, mWithToLast, mTryToLast, spTry, spWith) =
let bodyExpr, tpenv = TcExpr cenv overallTy env tpenv synBodyExpr
// Compile the pattern twice, once as a List.filter with all succeeding targets returning "1", and once as a proper catch block.
let filterClauses =
synWithClauses |> List.map (fun clause ->
let (SynMatchClause(pat, optWhenExpr, arrow, _, m, _)) = clause
let (SynMatchClause(pat, optWhenExpr, _, m, _, trivia)) = clause
let oneExpr = SynExpr.Const (SynConst.Int32 1, m)
SynMatchClause(pat, optWhenExpr, arrow, oneExpr, m, DebugPointAtTarget.No))
SynMatchClause(pat, optWhenExpr, oneExpr, m, DebugPointAtTarget.No, trivia))
let checkedFilterClauses, tpenv = TcMatchClauses cenv cenv.g.exn_ty (MustEqual cenv.g.int_ty) env tpenv filterClauses
let checkedHandlerClauses, tpenv = TcMatchClauses cenv cenv.g.exn_ty overallTy env tpenv synWithClauses
let v1, filterExpr = CompilePatternForMatchClauses cenv env mWithToLast mWithToLast true FailFilter None cenv.g.exn_ty cenv.g.int_ty checkedFilterClauses
Expand Down Expand Up @@ -6215,7 +6215,7 @@ and RewriteRangeExpr expr =
/// Check lambdas as a group, to catch duplicate names in patterns
and TcIteratedLambdas cenv isFirst (env: TcEnv) overallTy takenNames tpenv e =
match e with
| SynExpr.Lambda (isMember, isSubsequent, spats, _, bodyExpr, _, m) when isMember || isFirst || isSubsequent ->
| SynExpr.Lambda (isMember, isSubsequent, spats, bodyExpr, _, m, _) when isMember || isFirst || isSubsequent ->
let domainTy, resultTy = UnifyFunctionType None cenv env.DisplayEnv m overallTy.Commit
let vs, (tpenv, names, takenNames) = TcSimplePats cenv isMember CheckCxs domainTy env (tpenv, Map.empty, takenNames) spats
let envinner, _, vspecMap = MakeAndPublishSimpleValsForMergedScope cenv env m names
Expand Down Expand Up @@ -8484,7 +8484,7 @@ and TcImplicitOpItemThen cenv overallTy env id sln tpenv mItem delayed =
| SynExpr.ArrayOrList (_, synExprs, _) -> synExprs |> List.forall isSimpleArgument
| SynExpr.Record (copyInfo=copyOpt; recordFields=fields) -> copyOpt |> Option.forall (fst >> isSimpleArgument) && fields |> List.forall ((fun (SynExprRecordField(expr=e)) -> e) >> Option.forall isSimpleArgument)
| SynExpr.App (_, _, synExpr, synExpr2, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2
| SynExpr.IfThenElse (_, _, synExpr, _, synExpr2, _, synExprOpt, _, _, _, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 && Option.forall isSimpleArgument synExprOpt
| SynExpr.IfThenElse (ifExpr=synExpr; thenExpr=synExpr2; elseExpr=synExprOpt) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 && Option.forall isSimpleArgument synExprOpt
| SynExpr.DotIndexedGet (synExpr, _, _, _) -> isSimpleArgument synExpr
| SynExpr.ObjExpr _
| SynExpr.AnonRecd _
Expand Down Expand Up @@ -9711,7 +9711,7 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr expr cont =
TcLinearExprs bodyChecker cenv envinner overallTy tpenv isCompExpr body (fun (x, tpenv) ->
cont (fst (mkf (x, overallTy.Commit)), tpenv))

| SynExpr.IfThenElse (_, _, synBoolExpr, _, synThenExpr, _, synElseExprOpt, spIfToThen, isRecovery, mIfToThen, m) when not isCompExpr ->
| SynExpr.IfThenElse (synBoolExpr, synThenExpr, synElseExprOpt, spIfToThen, isRecovery, m, trivia) when not isCompExpr ->
let boolExpr, tpenv = TcExprThatCantBeCtorBody cenv (MustEqual cenv.g.bool_ty) env tpenv synBoolExpr
let thenExpr, tpenv =
let env =
Expand All @@ -9729,7 +9729,7 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr expr cont =

match synElseExprOpt with
| None ->
let elseExpr = mkUnit cenv.g mIfToThen
let elseExpr = mkUnit cenv.g trivia.IfToThenRange
let spElse = DebugPointAtTarget.No // the fake 'unit' value gets exactly the same range as spIfToThen
let overallExpr = primMkCond spIfToThen DebugPointAtTarget.Yes spElse m overallTy.Commit boolExpr thenExpr elseExpr
cont (overallExpr, tpenv)
Expand Down Expand Up @@ -9769,7 +9769,7 @@ and TcMatchClauses cenv inputTy (resultTy: OverallTy) env tpenv clauses =
List.mapFold (fun clause -> TcMatchClause cenv inputTy resultTy env (isFirst()) clause) tpenv clauses

and TcMatchClause cenv inputTy (resultTy: OverallTy) env isFirst tpenv synMatchClause =
let (SynMatchClause(pat, optWhenExpr, _, e, patm, spTgt)) = synMatchClause
let (SynMatchClause(pat, optWhenExpr, e, patm, spTgt, _)) = synMatchClause
let pat', optWhenExprR, vspecs, envinner, tpenv = TcMatchPattern cenv inputTy env tpenv (pat, optWhenExpr)
let resultEnv = if isFirst then envinner else { envinner with eContextInfo = ContextInfo.FollowingPatternMatchClause e.Range }
let e', tpenv = TcExprThatCanBeCtorBody cenv resultTy resultEnv tpenv e
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,12 @@
<Compile Include="..\XmlDoc.fs">
<Link>ParserAndUntypedAST\XmlDoc.fs</Link>
</Compile>
<Compile Include="..\SyntaxTrivia.fsi">
<Link>ParserAndUntypedAST\SyntaxTrivia.fsi</Link>
</Compile>
<Compile Include="..\SyntaxTrivia.fs">
<Link>ParserAndUntypedAST\SyntaxTrivia.fs</Link>
</Compile>
<Compile Include="..\SyntaxTree.fsi">
<Link>ParserAndUntypedAST\SyntaxTree.fsi</Link>
</Compile>
Expand Down
36 changes: 16 additions & 20 deletions src/fsharp/SyntaxTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ open FSharp.Compiler.Syntax
open FSharp.Compiler.Text
open FSharp.Compiler.Text.Range
open FSharp.Compiler.Xml
open FSharp.Compiler.SyntaxTrivia

[<Struct; NoEquality; NoComparison; DebuggerDisplay("{idText}")>]
type Ident (text: string, range: range) =
Expand Down Expand Up @@ -563,10 +564,10 @@ type SynExpr =
fromMethod: bool *
inLambdaSeq: bool *
args: SynSimplePats *
arrow: range option *
body: SynExpr *
parsedData: (SynPat list * SynExpr) option *
range: range
range: range *
trivia: SynExprLambdaTrivia

| MatchLambda of
isExnMatch: bool *
Expand Down Expand Up @@ -615,22 +616,20 @@ type SynExpr =
range: range

| TryWith of
tryKeywordRange: range *
tryExpr: SynExpr *
tryRange: range *
withKeywordRange: range *
withCases: SynMatchClause list *
withRange: range *
range: range *
tryDebugPoint: DebugPointAtTry *
withDebugPoint: DebugPointAtWith
withDebugPoint: DebugPointAtWith *
trivia: SynExprTryWithTrivia

| TryFinally of
tryExpr: SynExpr *
finallyExpr: SynExpr *
range: range *
tryDebugPoint: DebugPointAtTry *
finallyDebugPoint: DebugPointAtFinally
finallyDebugPoint: DebugPointAtFinally *
trivia: SynExprTryFinallyTrivia

| Lazy of
expr: SynExpr *
Expand All @@ -644,17 +643,13 @@ type SynExpr =
range: range

| IfThenElse of
ifKeyword: range *
isElif: bool *
ifExpr: SynExpr *
thenKeyword: range *
thenExpr: SynExpr *
elseKeyword: range option *
elseExpr: SynExpr option *
spIfToThen: DebugPointAtBinding *
isFromErrorRecovery: bool *
ifToThenRange: range *
range: range
range: range *
trivia: SynExprIfThenElseTrivia

| Ident of
ident: Ident
Expand Down Expand Up @@ -1187,14 +1182,14 @@ type SynMatchClause =
| SynMatchClause of
pat: SynPat *
whenExpr: SynExpr option *
arrow: range option *
resultExpr: SynExpr *
range: range *
debugPoint: DebugPointAtTarget
debugPoint: DebugPointAtTarget *
trivia: SynMatchClauseTrivia

member this.RangeOfGuardAndRhs =
match this with
| SynMatchClause(_, eo, _, e, _, _) ->
| SynMatchClause(whenExpr=eo; resultExpr=e) ->
match eo with
| None -> e.Range
| Some x -> unionRanges e.Range x.Range
Expand Down Expand Up @@ -1403,11 +1398,11 @@ type SynEnumCase =
| SynEnumCase of
attributes: SynAttributes *
ident: Ident *
equalsRange: range *
value: SynConst *
valueRange: range *
xmlDoc: PreXmlDoc *
range: range
range: range *
trivia: SynEnumCaseTrivia

member this.Range =
match this with
Expand All @@ -1422,7 +1417,8 @@ type SynUnionCase =
caseType: SynUnionCaseKind *
xmlDoc: PreXmlDoc *
accessibility: SynAccess option *
range: range
range: range *
trivia: SynUnionCaseTrivia

member this.Range =
match this with
Expand Down
34 changes: 15 additions & 19 deletions src/fsharp/SyntaxTree.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ namespace rec FSharp.Compiler.Syntax
open FSharp.Compiler.Syntax
open FSharp.Compiler.Text
open FSharp.Compiler.Xml
open FSharp.Compiler.SyntaxTrivia

/// Represents an identifier in F# code
[<Struct; NoEquality; NoComparison>]
Expand Down Expand Up @@ -693,10 +694,10 @@ type SynExpr =
fromMethod: bool *
inLambdaSeq: bool *
args: SynSimplePats *
arrow: range option *
body: SynExpr *
parsedData: (SynPat list * SynExpr) option *
range: range
range: range *
trivia: SynExprLambdaTrivia

/// F# syntax: function pat1 -> expr | ... | patN -> exprN
| MatchLambda of
Expand Down Expand Up @@ -760,23 +761,21 @@ type SynExpr =

/// F# syntax: try expr with pat -> expr
| TryWith of
tryKeywordRange: range *
tryExpr: SynExpr *
tryRange: range *
withKeywordRange: range *
withCases: SynMatchClause list *
withRange: range *
range: range *
tryDebugPoint: DebugPointAtTry *
withDebugPoint: DebugPointAtWith
withDebugPoint: DebugPointAtWith *
trivia: SynExprTryWithTrivia

/// F# syntax: try expr finally expr
| TryFinally of
tryExpr: SynExpr *
finallyExpr: SynExpr *
range: range *
tryDebugPoint: DebugPointAtTry *
finallyDebugPoint: DebugPointAtFinally
finallyDebugPoint: DebugPointAtFinally *
trivia: SynExprTryFinallyTrivia

/// F# syntax: lazy expr
| Lazy of
Expand All @@ -796,17 +795,13 @@ type SynExpr =
/// F# syntax: if expr then expr
/// F# syntax: if expr then expr else expr
| IfThenElse of
ifKeyword: range *
isElif: bool *
ifExpr: SynExpr *
thenKeyword: range *
thenExpr: SynExpr *
elseKeyword: range option *
elseExpr: SynExpr option *
spIfToThen: DebugPointAtBinding *
isFromErrorRecovery: bool *
ifToThenRange: range *
range: range
range: range *
trivia: SynExprIfThenElseTrivia

/// F# syntax: ident
/// Optimized representation for SynExpr.LongIdent (false, [id], id.idRange)
Expand Down Expand Up @@ -1321,10 +1316,10 @@ type SynMatchClause =
| SynMatchClause of
pat: SynPat *
whenExpr: SynExpr option *
arrow: range option *
resultExpr: SynExpr *
range: range *
debugPoint: DebugPointAtTarget
debugPoint: DebugPointAtTarget *
trivia: SynMatchClauseTrivia

/// Gets the syntax range of part of this construct
member RangeOfGuardAndRhs: range
Expand Down Expand Up @@ -1567,11 +1562,11 @@ type SynEnumCase =
| SynEnumCase of
attributes: SynAttributes *
ident: Ident *
equalsRange: range *
value: SynConst *
valueRange: range *
xmlDoc: PreXmlDoc *
range: range
range: range *
trivia: SynEnumCaseTrivia

/// Gets the syntax range of this construct
member Range: range
Expand All @@ -1586,7 +1581,8 @@ type SynUnionCase =
caseType: SynUnionCaseKind *
xmlDoc: PreXmlDoc *
accessibility: SynAccess option *
range: range
range: range *
trivia: SynUnionCaseTrivia

/// Gets the syntax range of this construct
member Range: range
Expand Down
Loading