Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit809d8a9

Browse files
committed
This addresses :
codeplex issue:https://visualfsharp.codeplex.com/workitem/72 [Regression] Indexer properties with more than 4 arguments cannot be accessedRemoves limit on indexer arguments, and allows unlimited slice dimensions. (changeset 1309219)
1 parentee3f737 commit809d8a9

File tree

3 files changed

+54
-36
lines changed

3 files changed

+54
-36
lines changed

‎src/fsharp/ast.fs‎

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1725,31 +1725,17 @@ let mkSynApp5 f x1 x2 x3 x4 x5 m = mkSynApp1 (mkSynApp4 f x1 x2 x3 x4 m) x5 m
17251725
letmkSynDotParenSet m a b c= mkSynTrifix m parenSet a b c
17261726
letmkSynDotBrackGet m mDot a b= SynExpr.DotIndexedGet(a,[SynIndexerArg.One b],mDot,m)
17271727
letmkSynQMarkSet m a b c= mkSynTrifix m qmarkSet a b c
1728-
17291728
letmkSynDotBrackSliceGet m mDot arr sliceArg= SynExpr.DotIndexedGet(arr,[sliceArg],mDot,m)
17301729

1731-
letmkSlice m mDot arr sliceArgs=
1732-
//let args = [ for arg in sliceArgs do
1733-
// match arg with
1734-
// | SynIndexerArg.Range (x1,x2) -> yield x1; yield x2
1735-
// | SynIndexerArg.One x -> yield x ]
1736-
SynExpr.DotIndexedGet(arr,sliceArgs,mDot,m)
1737-
1738-
letmkSynDotBrackSlice2Get m mDot arr sliceArg1 sliceArg2=
1739-
match sliceArg1, sliceArg2with
1740-
| SynIndexerArg.One x1, SynIndexerArg.One x2-> mkSynDotBrackGet m mDot arr(SynExpr.Tuple([x1;x2],[],unionRanges x1.Range x2.Range))
1741-
|_-> mkSlice m mDot arr[ sliceArg1; sliceArg2]
1742-
1743-
letmkSynDotBrackSlice3Get m mDot arr sliceArg1 sliceArg2 sliceArg3=
1744-
match sliceArg1, sliceArg2, sliceArg3with
1745-
| SynIndexerArg.One x1, SynIndexerArg.One x2, SynIndexerArg.One x3-> mkSynDotBrackGet m mDot arr(SynExpr.Tuple([x1;x2;x3],[],unionRanges x1.Range x3.Range))
1746-
|_-> mkSlice m mDot arr[ sliceArg1; sliceArg2; sliceArg3]
1747-
1748-
letmkSynDotBrackSlice4Get m mDot arr sliceArg1 sliceArg2 sliceArg3 sliceArg4=
1749-
match sliceArg1, sliceArg2, sliceArg3, sliceArg4with
1750-
| SynIndexerArg.One x1, SynIndexerArg.One x2, SynIndexerArg.One x3, SynIndexerArg.One x4-> mkSynDotBrackGet m mDot arr(SynExpr.Tuple([x1;x2;x3;x4],[],unionRanges x1.Range x4.Range))
1751-
|_-> mkSlice m mDot arr[ sliceArg1; sliceArg2; sliceArg3; sliceArg4]
1752-
1730+
letmkSynDotBrackSeqSliceGet m mDot arr(argslist:list<SynIndexerArg>)=
1731+
letnotsliced=[for argin argslistdo
1732+
match argwith
1733+
| SynIndexerArg.One x->yield x
1734+
|_->()]
1735+
if notsliced.Length= argslist.Lengththen
1736+
SynExpr.DotIndexedGet(arr,[SynIndexerArg.One(SynExpr.Tuple(notsliced,[],unionRanges(Seq.head notsliced).Range(Seq.last notsliced).Range))],mDot,m)
1737+
else
1738+
SynExpr.DotIndexedGet(arr,argslist,mDot,m)
17531739

17541740
letmkSynDotParenGet lhsm dotm a b=
17551741
match bwith

‎src/fsharp/pars.fsy‎

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,6 @@ let rangeOfLongIdent(lid:LongIdent) =
440440
%left COMMA
441441
%nonassoc slice_expr /* matrix.[e COMMA e] has higher precedence than "e COMMA e" */
442442
%nonassoc DOT_DOT /* for matrix.[1..2,3..4] the ".." has higher precedence than expression "2 COMMA 3" */
443-
%nonassoc slice_comma /* for matrix.[1..2,3..4] the "," has higher precedence than ".." */
444443
%nonassoc paren_pat_colon
445444
%nonassoc paren_pat_attribs
446445
%left OR BAR_BAR JOIN_IN
@@ -2907,7 +2906,7 @@ typedSeqExpr:
29072906
| seqExpr { $1 }
29082907

29092908
seqExpr:
2910-
| declExpr seps seqExpr
2909+
| declExpr seps seqExpr
29112910
{ SynExpr.Sequential(SequencePointsAtSeq,true,$1,$3,unionRanges $1.Range $3.Range) }
29122911
| declExpr seps
29132912
{ $1 }
@@ -3573,21 +3572,19 @@ atomicExprQualification:
35733572
mlCompatWarning (FSComp.SR.parsParenFormIsForML()) (lhs parseState);
35743573
mkSynDotParenGet lhsm dotm e $2) }
35753574

3576-
| LBRACK typedSeqExpr RBRACK
3575+
| LBRACK typedSeqExpr RBRACK
35773576
{ (fun e lhsm dotm -> mkSynDotBrackGet lhsm dotm e $2) }
3578-
3577+
35793578
| LBRACK typedSeqExpr recover
35803579
{ reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBracket());
35813580
(fun e lhsm dotm -> exprFromParseError (mkSynDotBrackGet lhsm dotm e $2)) }
35823581

3583-
| LBRACK optRange RBRACK
3584-
{ (fun e lhsm dotm -> mkSynDotBrackSliceGet lhsm dotm e $2) }
3585-
| LBRACK optRange COMMA optRange RBRACK %prec slice_comma
3586-
{ (fun e lhsm dotm -> mkSynDotBrackSlice2Get lhsm dotm e $2 $4) }
3587-
| LBRACK optRange COMMA optRange COMMA optRange RBRACK %prec slice_comma
3588-
{ (fun e lhsm dotm -> mkSynDotBrackSlice3Get lhsm dotm e $2 $4 $6) }
3589-
| LBRACK optRange COMMA optRange COMMA optRange COMMA optRange RBRACK %prec slice_comma
3590-
{ (fun e lhsm dotm -> mkSynDotBrackSlice4Get lhsm dotm e $2 $4 $6 $8) }
3582+
| LBRACK optRangeSeqExpr RBRACK
3583+
{ (fun e lhsm dotm -> mkSynDotBrackSeqSliceGet lhsm dotm e $2) }
3584+
3585+
| LBRACK optRangeSeqExpr recover
3586+
{ reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBracket());
3587+
(fun e lhsm dotm -> exprFromParseError (mkSynDotBrackSeqSliceGet lhsm dotm e $2)) }
35913588

35923589
| LBRACK error RBRACK
35933590
{ let mArg = rhs2 parseState 1 3
@@ -3598,6 +3595,9 @@ atomicExprQualification:
35983595
let mArg = (rhs parseState 1).EndRange
35993596
(fun e lhsm dotm -> exprFromParseError (mkSynDotBrackGet lhsm dotm e (arbExpr("indexerExpr2",mArg)))) }
36003597

3598+
optRangeSeqExpr:
3599+
| optRange COMMA optRangeSeqExpr { $1::$3 }
3600+
| optRange { [$1] }
36013601

36023602
optRange:
36033603
| declExpr DOT_DOT declExpr
@@ -3610,7 +3610,6 @@ optRange:
36103610
{ SynIndexerArg.Two(mkSynOptionalExpr (rhs parseState 1) None, mkSynOptionalExpr (rhs parseState 1) None) }
36113611
| declExpr %prec slice_expr
36123612
{ SynIndexerArg.One($1) }
3613-
36143613

36153614
/* the start et of atomicExprAfterType must not overlap with the valid postfix tokens of the type syntax, e.g. new List<T>(...) */
36163615
atomicExprAfterType:

‎tests/fsharp/core/array/test.fsx‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,6 +1330,39 @@ module bug872632 =
13301330

13311331
do check"bug872632" Foo.x.Length8
13321332

1333+
modulemanyIndexes=
1334+
openSystem
1335+
1336+
// Bug in F# 3.1: Indexer Properties was incorrectly limited to 4 arguments. There were no limits in previous versions of F#, and shouldn't be in future versions
1337+
// Repro code for bug in F# 3.1. This compiles perfectly in F# 3.0
1338+
1339+
// ----------------------------------------------------------------------------
1340+
typeTest()=
1341+
/// Variable number of arguments with indexer property
1342+
memberx.Itemwith get([<ParamArray>]objs:obj[])= objs
1343+
1344+
/// PASS: Variable number of arguments with member function
1345+
memberx.Foo([<ParamArray>]objs:obj[])= objs
1346+
1347+
// ----------------------------------------------------------------------------
1348+
letCompileIndexerTest=
1349+
lettest= Test()
1350+
1351+
// No problems with method having vaiable number of parameters
1352+
letu1= test.Foo(null,null,null,null)
1353+
letu2= test.Foo(null,null,null,null,null)
1354+
letu3= test.Foo(null,null,null,null,null,null,null,null,null)
1355+
1356+
// Bug was that the indexer Property was limited to 4 parameters (Issue introduced by matrix slicing code)
1357+
letu4= test.[null]
1358+
letu5= test.[null,null]
1359+
letu6= test.[null,null,null]
1360+
letu7= test.[null,null,null,null]
1361+
letu8= test.[null,null,null,null,null]// Ensure that F# 3.1 is not unhappy with more than 4 arguments
1362+
letu9= test.[null,null,null,null,null,null,null,null,null,null,null,null,null]// Ensure that F# 3.1 is not unhappy with many more than 4 arguments, 13 arguments would be really unlucky
1363+
0
1364+
1365+
13331366
#if Portable
13341367
#else// this overload of CreateInstance doesn't exist in portable
13351368
modulebug6447=

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp