From de05357b9e3736b143e9cc3bc49e469762795ba1 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 6 Aug 2006 13:49:51 +0000 Subject: [PATCH] Fixed SD2-971: Correct VB arrays declaration and redim-statements are recognized as code errors. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1669 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../LineCounterSDAddIn/LineCounter.sdaddin | Bin 0 -> 25719 bytes .../addinmanager.png | Bin .../projectbrowser.png | Bin .../properties.png | Bin .../screenshot.png | Bin .../screenshot2.png | Bin .../templatetype.png | Bin .../Article/LineCounterSharpDevelopAddIn.html | 75 +- samples/LineCounter/LineCounter.addin | 2 +- samples/LineCounter/LineCounter.csproj | 5 + .../InteractionClass.cs | 2 +- .../SharpDevelopInteraction.csproj | 5 + .../Project/Src/Parser/VBNet/Parser.cs | 1727 +++++++++-------- .../Project/Src/Parser/VBNet/VBNET.ATG | 111 +- .../Project/Src/Parser/VBNet/VBNetParser.cs | 6 + .../Expressions/ArrayCreateExpressionTests.cs | 11 + .../Parser/Statements/ReDimStatementTests.cs | 29 +- 17 files changed, 1055 insertions(+), 918 deletions(-) create mode 100644 samples/LineCounter/Article/LineCounterSDAddIn/LineCounter.sdaddin rename samples/LineCounter/Article/{LineCounterSharpDevelopAddIn => LineCounterSDAddIn}/addinmanager.png (100%) rename samples/LineCounter/Article/{LineCounterSharpDevelopAddIn => LineCounterSDAddIn}/projectbrowser.png (100%) rename samples/LineCounter/Article/{LineCounterSharpDevelopAddIn => LineCounterSDAddIn}/properties.png (100%) rename samples/LineCounter/Article/{LineCounterSharpDevelopAddIn => LineCounterSDAddIn}/screenshot.png (100%) rename samples/LineCounter/Article/{LineCounterSharpDevelopAddIn => LineCounterSDAddIn}/screenshot2.png (100%) rename samples/LineCounter/Article/{LineCounterSharpDevelopAddIn => LineCounterSDAddIn}/templatetype.png (100%) diff --git a/samples/LineCounter/Article/LineCounterSDAddIn/LineCounter.sdaddin b/samples/LineCounter/Article/LineCounterSDAddIn/LineCounter.sdaddin new file mode 100644 index 0000000000000000000000000000000000000000..3eabb6da92eb7441d439727a63538b86e7de5157 GIT binary patch literal 25719 zcmV)VK(D`0O9KQH00ICA02Y<096J601*HH08D9aWkYXuZggdGE@5P3 zX>OI2+iuf95QeW?sqZlOn%KZ4NsvM+RYg>w1_8J0-D$mL4`z3r1FyyfkJMLSb~kpN z9;7x(#*Q`n&o}=}a{Kq+Y$3$C0mC%H{xyf_?STPq9Tq>3j!F2x;cU7_NXdI!_$);$8VBpP5zTV)4Nx zDN2p|+Pbwa0P`Mot#S0pqaD=Z>q`5-lm z^<7n&BIAzm;`gsCGfzFW)kb)i-OE&up_-lL-jvS*;Lk=Rl+BAdV5_6-~eh znTAuWtm@+37c#K`>A~1Q$pI#lEVLYQbDM_;81HAiFVCjJ0|65HZ9OQ|t3&lXn&m3&Xf}_*aKc#M zOv@X(^0uYG>9gHZn3hd^&@}Xk59lfd0oxe3_b|6YnMIb9ZNEHM57LnH4%lJG-mZwOZY)6JZ^Q72>{D(jXSJD$%oxf%O8y7r_x=%U~d} z!NSC`0}cvcP62kn3M2@y!);^7es)6g{1R;QlssN`^Z$Q!Pjyeva>O{#?`2y|SJhX4 z{r_Ko9e-7IEt}7}iRp~70Q|r-yy;a}E4zvX9oV2g1*{Jj^#e-*W0j{iWPK zOYFA#268+5_U;vfxgEuvHMBR^zc;t`xPU_8=3fVQBaC~%v>+E!08LxBIp$_c`h{G{5TrM_(j9}v%LgIc6}IbD$GwV478i6_C2J?dNw*%GCdWN= zV2z#*tGGu1Va(Q<=sJCLtJ%ae@k~4u&%`tFOgt0M#53_sJQL5v^Z)YcnJxE-xHr{U zkp1po7`t;NW6sX;j9$iWzvaX8`vl9^FcvAn#@i6J5M!-VwLEM_BdsjeDfiOAJHfPJ z2m+A;Gg?2Vm4ZM%f`FD!U?HYiklH7blxStFxl?Ch19fBxZPG{tN$W?VR3ary+9U5J0W*-m+pkz%U!w?@*p6M9^?ohO&;W^ z4|&0dyza7rM1Bg$WDoMT4|&Ijyyru>#`aC|AYnkJdXNMl*{}zi;)iA-6!AcF5sG@C zrGDr{gkm1(6old)=xjf<8=)ExbSXl$9%w&8bsp#dLJ1Fa8$wBM10$63K!>%;UU0;R z9Q7eD`H(jiQa@_I@G?r%;T45M%t^!`5qA=CNYprqQ~-PERP3Qa>Y+iWhngZQr39TG z8uB36L&F~AK_3nF2rqKPM|0GNyx>D#_aQ&^A#eMTcYMfuKIDi`!=pX~ZSJ)OcC$pl z1D)cB&h|sQ{m`X;Xo^o@!cTO!A3ETN4*Q|o{Lp?sG}jL;^+U6K#(LAIdsrdp78tKX zpYS+qf1A~!|4DUf>{WU8n_%^kfXD%9)Xbc@EIA^ae-*pFmp7ka;bxM1B%FL85WP!_%wNO#1+u)r{P$Q3g`rhX>_(J5*dO z#i2hF-C1EHBzquf{Zd2!GY`p4F$?mp%EK!^8(z|4^$z8GiV_@tLI;Pxk`ji1wvEhy zX~#D5U4|%7<(oSL>=?)oqI{16=~z0RP6fL0s{}KXT2fC2aN%LFL;#qif{CD#+@dSV zVPEc2cW!$i5h(DCm*Qj>g$)&5kXL^!x}<+>Y|O5NW(}*Vz7+)R-=faU>HMFw9~@;t zurL3Jbxr(n*7Xa2h`J{KIO}@%hpH>iQBX;wO29y$Zv^#GUf^k34AUGIULS#PunED;p{o{1NwTEg?J#- z%Lq7&E|h5z1@U*Atdv;d}=zk0B9cn8%2NUBl4;nOX-^x7u?&eiI8h_5nRK znrZ5oERc5QjWEn;y}@*EVX>Ab<78)fvogJfsakfHfay0f$-$}e1w)3d)E-lyJ;MI> zIR2s917a0f4R%%#Vij49c9xM{mTf7UJ)LdOwkLuKqq4osgsIxA5gVfqNy`PpiC}ic zd_^l;tpN$UA*2)~Qv>P+67l2oOJ?gXu zSJ@`?1G8%FrLN1|rXa;N;C3QJLiu`{c0lzFC=89g5JnYjHN&H6)4kOsUh*wYLea|= zSG&FnW`!iPj)Ru8YtMfIu$in?uFc+HKfH(2+N`-V$i4+(RQ3&IJ%gC&Vk5j?k%}{2 zY{IrE6q9;>v%OO;lk}X4-c9WOIRq0=uX!j+wu67LsS;8b~v5;F@$Sv)WN@)e^ z(AZSstm?xs9q%?dNmJcImI#ZpsV(Kv3UvBq$mSgB5zsVCp2Y@CP$63#&-qNGFee$I z^O;nTC2&weH!uC-9wtaL^Geiobx6C`SN%7x z#1>UpJ7pTaTAS5sZTM9J)`qXvX0=)yzFM2rYR%rtr9vzb5<769>?A)E z61&O?TxgCrHMg==3*?UXMK14k)j^`xb!LlW=^~iV`UCPR(q?;&y4+c#R++$Xb18~) zU`32}C|RhN+esIy$vryqx)Z`U@+w_OvyYB0+z`8^2gdqaFX2pZ5zba03!saBVy>fe zG{nV}2#8BC)Qyp4WUTVkZHPTssukCI2IyUby6SQpf=iGH=^Zr zD~5e#939uPs)VleM^Vn@yG^@C$o^Y!#)94!)rO;TSqm-~dU*|#fSmG~rsqp^R6+ZO zyAw3lU<{Q8apjAIF9z^y#SkiV8Fnoz8f5#@rBBjIcSboL(@K|Pkr;imxB{cID0(GE z^AsJ%=xl|yDwNi5rB7kBjiMtMt)u8w7_F!1)fjD3(PkB$tfEs?bgGJW$j>WSr_wbD zWGQbyMsq6KqN39%dM!pzQ0R0Oo#A5nX$0Dp!bv4LrJ|EmG_9f;6>U(_#!BupDep5F zjVmQ;RJ2w_6EtIBYlzQcSNxnDZ3KM261c7su;a5_acm3mCoVz)uCD~_c-9q#TB)MUtE-lmI|HV@-1*=PN(Yei29@6|Zd8eMx^xrfe^Ei!8tAm*OA3&@ zZmPyBEe^U0Zo`6KuC$xfGVaoH7L~lwWy71%WgdXVEsuxO+At1>L*a~ce}}>i+HfmH z8s#GKP`F7hs}6<5EiRVcx*%i?yXrE_sY|xeQ;}J;F8_)>@-U zyUVG+o9bMox?OeDX7Oh#QDIqxtj`k26kC8@$8cj7LUNQ-Z{5?)&(WPQ_R%lfhzu)-cQNF{I%6?eP2A9N@F z!mY$NT?I!CJo7C5B{KY$#GB|l7YhHj0&-8Gq5nz(⋙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 -
    -
  • Download Source Project (C#) - * KB
  • -
  • Download AddIn Installation Package (.sdaddin) - * KB
  • + + + +

    - +

    - Introduction
    + Introduction

    When seeing the article Line Counter - Writing a Visual Studio 2005 Add-In -[^], +[^] +written by Jon Rista, I wanted to show you how to write that AddIn for SharpDevelop.
    In this article I will show you how to create an AddIn, but I will not discuss the concepts of the SharpDevelop's AddIn architecture here - you can read more @@ -36,23 +40,24 @@ about that in my article Applications with the SharpDevelop Core [^]. The line counter code is taken from the VS 2005 AddIn written by Jon Rista; the -counting algorithm itself is from Oz Solomon.
    +counting algorithm itself is from Oz Solomon.
    I will discuss every of my changes to the code in this article - after all, there aren't so many changes required.

    Creating a new AddIn

    Our AddIn will be a menu entry in the "Tools" menu that opens a document window -displaying the line counter UI. SharpDevelop already comes with a project -template for an AddIn extending the "Tools" menu: "Tools menu entry"
    -
    +displaying the line counter UI. While it is possible to develop SharpDevelop AddIns in Visual Studio, you can get +started a lot faster if you use SharpDevelop because it already comes with a project +template for an AddIn extending the "Tools" menu: "Tools menu entry".
    +

    -We create a SharpDevelop Macro with the name "LineCounter". The "SharpDevelop +We create a SharpDevelop AddIn with the name "LineCounter". The "SharpDevelop AddIn" template could also be used, but it starts with an AddIn defining a pad (a docked tool window like "Projects", "Properties"); the "Tool menu entry" AddIn starts with a menu command.
    Now let's look at what SharpDevelop has generated for us:
    We have a project with a few files:
    -
    +
    First look at the .addin file:
    The template already defines a menu item in the tools menu, we'll just modify the label. And we'll add a new section to the .addin file: the <Manifest> @@ -69,7 +74,7 @@ item inside a <Condition name="SolutionOpen" action="disable">
    Here is how the content of LineCounter.addin should look like after these steps:
    <AddIn name        = "LineCounter"
            author      = "Daniel Grunwald"
    -       url         = "http://www.codeproject.com/useritems/LineCounterSharpDevelopAddIn.asp"
    +       url         = "http://www.codeproject.com/useritems/LineCounterSDAddIn.asp"
            description = "Advanced line counter AddIn">
        
         <Manifest>
    @@ -92,7 +97,7 @@ Here is how the content of LineCounter.addin should look like after these steps:
     </AddIn>
     
    Our menu item uses the "class" attribute. When the menu item is clicked, SharpDevelop will create an instance of this class and call its Run() -method. This class is defined the file Command.cs. The example code from the +method. This class is defined in the file Command.cs. The example code from the template accesses the currently opened text editor and reverses the letters in the currently selected text. We are not interested in accessing the text editor, so we can delete the content of the Run() method and start writing our own.
    @@ -105,19 +110,20 @@ about missing references. This is because the template is missing the assembly references to the SharpDevelop libraries - these have to hard-coded paths in most cases, so you should add them manually. Add references to ICSharpCode.Core.dll and ICSharpCode.SharpDevelop.dll from the bin directory of -your SharpDevelop installation. ICSharpCode.Core contains the AddIn system, we -need the base class of our menu command from it. ICSharpCode.SharpDevelop is the -largest part of SharpDevelop, we'll use the project system from it.
    +your SharpDevelop installation. ICSharpCode.Core contains the AddIn system, +and also the base class for our menu command. +ICSharpCode.SharpDevelop is the largest part of SharpDevelop, it contains +the project system and many other things.
    Make sure you set "Local copy" for the references to -False.
    -
    +False.
    +

    You should now be able to successfully compile the project. If you look into the bin/Debug directory, you will see a copy of LineCounter.addin, the compiled LineCounter.dll and the debug symbols.
    If you want to test your AddIn, you need to register it with SharpDevelop. The best way for testing is to copy these files to the AddIns directory of your -SharpDevelop installation. Restart SharpDevelop to let it load the AddIn. You +SharpDevelop installation. Restart SharpDevelop to load the AddIn. You should see the "Line Counter" command in the Tools menu, disabled until you open a solution. If you click the menu item, the message box should show up.
    If you want to update your AddIn, you'll need to shutdown SharpDevelop, copy the @@ -130,15 +136,15 @@ Visual Studio to write your AddIn...
    Now to the real work: Implementing the line counter. We want to display the line counter user interface as a document, like the start page. Document views in -SharpDevelop are called ViewContents. +SharpDevelop are called ViewContents. There are two types of view contents: primary and secondary. A primary view content is capable of displaying something on its own; a secondary view content extends another view content by displaying multiple tabs in the document - SharpDevelop's Windows.Forms designer is a secondary view content. We want to display a simple document view, so we'll use a normal (primary) view -content.
    +content.

    -
    Showing such a view content is easy:
    +Showing such a view content is easy:
    public override void Run()
     {
         WorkbenchSingleton.Workbench.ShowView(new LineCounterViewContent());
    @@ -274,7 +280,7 @@ m_projIconMappings.Add("{00000001-0000-0000-0000-000000000000}", 5);
     

    Although the extension process is very different in SharpDevelop and Visual Studio; the API is quite similar - after all, both are modelling MSBuild - solutions and after a similar feature set. I hope this shows you that porting + solutions and a similar feature set. I hope this shows you that porting AddIns from Visual Studio to SharpDevelop isn't very hard and we would like to see more SharpDevelop AddIns in the future.

    @@ -282,7 +288,7 @@ m_projIconMappings.Add("{00000001-0000-0000-0000-000000000000}", 5); Here an image showing the AddIn counting itself:

    - +

    Possible improvements @@ -337,7 +343,7 @@ can add SharpDevelop icons to an existing image list.
    } }

    -We +We will use two instances of this class to control the two image lists imgProjectTypes and imgFileTypes.
    ScanSolution() is getting the icon index from m_projIconMappings - we will @@ -419,7 +425,7 @@ name "LineCountingAlgorithm". Don't be irritated that it's not defined in the XML schema for .addin files - we are creating a new possible codon name here; the XML schema is just for code completion when editing the .addin file.
    Now how can we define this codon type? Constructing objects from the AddInTree -is done by the doozers (the name comes +is done by the doozers (the name comes from these guys @@ -480,8 +486,7 @@ CountingAlgorithmDescriptor. Let's define that class:
    }

    - Now only the change to LineCounterBrowser to actually use this code is - missing. + Now the LineCounterBrowser code has to be changed to use the code we just wrote.

    We will need a member variable storing the list of existing counting algorithms:
    List<CountingAlgorithmDescriptor> countingAlgorithms;
    @@ -555,7 +560,7 @@ the zip file to "LineCounter.sdaddin". That really was everything you had to do
     where you can install the AddIn with just one click. AddIns installed this way
     will be extracted to %Application Data%\.ICSharpCode\SharpDevelop2\AddIns.

    -
    +

    More AddIn-writing help

    @@ -589,7 +594,7 @@ will be extracted to %Application Data%\.ICSharpCode\SharpDevelop2\AddIns.
    Summary

    - This article shows you how to start writing SharpDevelop AddIns. It is a + This article shows you how to start writing SharpDevelop AddIns. It is a complete walkthrough from creating a new project to creating the installation package.

    @@ -601,9 +606,7 @@ will be extracted to %Application Data%\.ICSharpCode\SharpDevelop2\AddIns.
    18th July, 2006: Article published (based on SharpDevelop 2.0.0.1591).
-
-
-
-
-
+ + + \ No newline at end of file diff --git a/samples/LineCounter/LineCounter.addin b/samples/LineCounter/LineCounter.addin index d2091518fd..20f2903c67 100644 --- a/samples/LineCounter/LineCounter.addin +++ b/samples/LineCounter/LineCounter.addin @@ -5,7 +5,7 @@ - + diff --git a/samples/LineCounter/LineCounter.csproj b/samples/LineCounter/LineCounter.csproj index 3cd9bb19b5..7d141be14c 100644 --- a/samples/LineCounter/LineCounter.csproj +++ b/samples/LineCounter/LineCounter.csproj @@ -51,6 +51,11 @@ False False + + ..\..\bin\ICSharpCode.SharpDevelop.Dom.dll + False + False + diff --git a/samples/SdaUser/SharpDevelopInteraction/InteractionClass.cs b/samples/SdaUser/SharpDevelopInteraction/InteractionClass.cs index 047c7e557f..d42da95edd 100644 --- a/samples/SdaUser/SharpDevelopInteraction/InteractionClass.cs +++ b/samples/SdaUser/SharpDevelopInteraction/InteractionClass.cs @@ -24,7 +24,7 @@ namespace SharpDevelopInteraction { public void MakeTransparent() { - WorkbenchSingleton.SafeThreadAsyncCall(new MethodInvoker(MakeTransparentInternal)); + WorkbenchSingleton.SafeThreadAsyncCall(MakeTransparentInternal); } void MakeTransparentInternal() diff --git a/samples/SdaUser/SharpDevelopInteraction/SharpDevelopInteraction.csproj b/samples/SdaUser/SharpDevelopInteraction/SharpDevelopInteraction.csproj index 61770806c2..e5c5ea4f33 100644 --- a/samples/SdaUser/SharpDevelopInteraction/SharpDevelopInteraction.csproj +++ b/samples/SdaUser/SharpDevelopInteraction/SharpDevelopInteraction.csproj @@ -50,6 +50,11 @@ False + + ..\..\..\bin\ICSharpCode.SharpDevelop.Dom.dll + False + False + diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs index 668e229713..0d88da91c8 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs @@ -149,7 +149,7 @@ out u); void GlobalAttributeSection() { -#line 1983 "VBNET.ATG" +#line 2005 "VBNET.ATG" Location startPos = t.Location; Expect(27); if (la.kind == 49) { @@ -158,20 +158,20 @@ out u); lexer.NextToken(); } else SynErr(208); -#line 1985 "VBNET.ATG" +#line 2007 "VBNET.ATG" string attributeTarget = t.val.ToLower(System.Globalization.CultureInfo.InvariantCulture); List attributes = new List(); ASTAttribute attribute; Expect(13); Attribute( -#line 1989 "VBNET.ATG" +#line 2011 "VBNET.ATG" out attribute); -#line 1989 "VBNET.ATG" +#line 2011 "VBNET.ATG" attributes.Add(attribute); while ( -#line 1990 "VBNET.ATG" +#line 2012 "VBNET.ATG" NotFinalComma()) { if (la.kind == 12) { lexer.NextToken(); @@ -183,10 +183,10 @@ NotFinalComma()) { Expect(13); } Attribute( -#line 1990 "VBNET.ATG" +#line 2012 "VBNET.ATG" out attribute); -#line 1990 "VBNET.ATG" +#line 2012 "VBNET.ATG" attributes.Add(attribute); } if (la.kind == 12) { @@ -195,7 +195,7 @@ out attribute); Expect(26); EndOfStmt(); -#line 1995 "VBNET.ATG" +#line 2017 "VBNET.ATG" AttributeSection section = new AttributeSection(attributeTarget, attributes); section.StartLocation = startPos; section.EndLocation = t.EndLocation; @@ -312,47 +312,47 @@ out aliasedType); } void Qualident( -#line 2699 "VBNET.ATG" +#line 2722 "VBNET.ATG" out string qualident) { -#line 2701 "VBNET.ATG" +#line 2724 "VBNET.ATG" string name; qualidentBuilder.Length = 0; Identifier(); -#line 2705 "VBNET.ATG" +#line 2728 "VBNET.ATG" qualidentBuilder.Append(t.val); while ( -#line 2706 "VBNET.ATG" +#line 2729 "VBNET.ATG" DotAndIdentOrKw()) { Expect(10); IdentifierOrKeyword( -#line 2706 "VBNET.ATG" +#line 2729 "VBNET.ATG" out name); -#line 2706 "VBNET.ATG" +#line 2729 "VBNET.ATG" qualidentBuilder.Append('.'); qualidentBuilder.Append(name); } -#line 2708 "VBNET.ATG" +#line 2731 "VBNET.ATG" qualident = qualidentBuilder.ToString(); } void TypeName( -#line 1876 "VBNET.ATG" +#line 1898 "VBNET.ATG" out TypeReference typeref) { -#line 1877 "VBNET.ATG" +#line 1899 "VBNET.ATG" ArrayList rank = null; NonArrayTypeName( -#line 1879 "VBNET.ATG" +#line 1901 "VBNET.ATG" out typeref, false); ArrayTypeModifiers( -#line 1880 "VBNET.ATG" +#line 1902 "VBNET.ATG" out rank); -#line 1881 "VBNET.ATG" +#line 1903 "VBNET.ATG" if (rank != null && typeref != null) { typeref.RankSpecifier = (int[])rank.ToArray(typeof(int)); } @@ -369,35 +369,35 @@ out rank); } void AttributeSection( -#line 2053 "VBNET.ATG" +#line 2075 "VBNET.ATG" out AttributeSection section) { -#line 2055 "VBNET.ATG" +#line 2077 "VBNET.ATG" string attributeTarget = "";List attributes = new List(); ASTAttribute attribute; Expect(27); -#line 2059 "VBNET.ATG" +#line 2081 "VBNET.ATG" Location startPos = t.Location; if ( -#line 2060 "VBNET.ATG" +#line 2082 "VBNET.ATG" IsLocalAttrTarget()) { if (la.kind == 93) { lexer.NextToken(); -#line 2061 "VBNET.ATG" +#line 2083 "VBNET.ATG" attributeTarget = "event"; } else if (la.kind == 154) { lexer.NextToken(); -#line 2062 "VBNET.ATG" +#line 2084 "VBNET.ATG" attributeTarget = "return"; } else { Identifier(); -#line 2065 "VBNET.ATG" +#line 2087 "VBNET.ATG" string val = t.val.ToLower(System.Globalization.CultureInfo.InvariantCulture); if (val != "field" || val != "method" || val != "module" || val != "param" || @@ -410,20 +410,20 @@ IsLocalAttrTarget()) { Expect(13); } Attribute( -#line 2075 "VBNET.ATG" +#line 2097 "VBNET.ATG" out attribute); -#line 2075 "VBNET.ATG" +#line 2097 "VBNET.ATG" attributes.Add(attribute); while ( -#line 2076 "VBNET.ATG" +#line 2098 "VBNET.ATG" NotFinalComma()) { Expect(12); Attribute( -#line 2076 "VBNET.ATG" +#line 2098 "VBNET.ATG" out attribute); -#line 2076 "VBNET.ATG" +#line 2098 "VBNET.ATG" attributes.Add(attribute); } if (la.kind == 12) { @@ -431,7 +431,7 @@ out attribute); } Expect(26); -#line 2080 "VBNET.ATG" +#line 2102 "VBNET.ATG" section = new AttributeSection(attributeTarget, attributes); section.StartLocation = startPos; section.EndLocation = t.EndLocation; @@ -439,69 +439,69 @@ out attribute); } void TypeModifier( -#line 2775 "VBNET.ATG" +#line 2798 "VBNET.ATG" ModifierList m) { switch (la.kind) { case 148: { lexer.NextToken(); -#line 2776 "VBNET.ATG" +#line 2799 "VBNET.ATG" m.Add(Modifiers.Public, t.Location); break; } case 147: { lexer.NextToken(); -#line 2777 "VBNET.ATG" +#line 2800 "VBNET.ATG" m.Add(Modifiers.Protected, t.Location); break; } case 99: { lexer.NextToken(); -#line 2778 "VBNET.ATG" +#line 2801 "VBNET.ATG" m.Add(Modifiers.Internal, t.Location); break; } case 145: { lexer.NextToken(); -#line 2779 "VBNET.ATG" +#line 2802 "VBNET.ATG" m.Add(Modifiers.Private, t.Location); break; } case 158: { lexer.NextToken(); -#line 2780 "VBNET.ATG" +#line 2803 "VBNET.ATG" m.Add(Modifiers.Static, t.Location); break; } case 157: { lexer.NextToken(); -#line 2781 "VBNET.ATG" +#line 2804 "VBNET.ATG" m.Add(Modifiers.New, t.Location); break; } case 122: { lexer.NextToken(); -#line 2782 "VBNET.ATG" +#line 2805 "VBNET.ATG" m.Add(Modifiers.Abstract, t.Location); break; } case 131: { lexer.NextToken(); -#line 2783 "VBNET.ATG" +#line 2806 "VBNET.ATG" m.Add(Modifiers.Sealed, t.Location); break; } case 203: { lexer.NextToken(); -#line 2784 "VBNET.ATG" +#line 2807 "VBNET.ATG" m.Add(Modifiers.Partial, t.Location); break; } @@ -939,28 +939,28 @@ out typeRef); } void TypeImplementsClause( -#line 1476 "VBNET.ATG" +#line 1470 "VBNET.ATG" out List baseInterfaces) { -#line 1478 "VBNET.ATG" +#line 1472 "VBNET.ATG" baseInterfaces = new List(); TypeReference type = null; Expect(107); TypeName( -#line 1481 "VBNET.ATG" +#line 1475 "VBNET.ATG" out type); -#line 1483 "VBNET.ATG" +#line 1477 "VBNET.ATG" baseInterfaces.Add(type); while (la.kind == 12) { lexer.NextToken(); TypeName( -#line 1486 "VBNET.ATG" +#line 1480 "VBNET.ATG" out type); -#line 1487 "VBNET.ATG" +#line 1481 "VBNET.ATG" baseInterfaces.Add(type); } EndOfStmt(); @@ -1078,10 +1078,10 @@ m, attributes); } void NonArrayTypeName( -#line 1899 "VBNET.ATG" +#line 1921 "VBNET.ATG" out TypeReference typeref, bool canBeUnbound) { -#line 1901 "VBNET.ATG" +#line 1923 "VBNET.ATG" string name; typeref = null; bool isGlobal = false; @@ -1091,38 +1091,38 @@ out TypeReference typeref, bool canBeUnbound) { lexer.NextToken(); Expect(10); -#line 1906 "VBNET.ATG" +#line 1928 "VBNET.ATG" isGlobal = true; } QualIdentAndTypeArguments( -#line 1907 "VBNET.ATG" +#line 1929 "VBNET.ATG" out typeref, canBeUnbound); -#line 1908 "VBNET.ATG" +#line 1930 "VBNET.ATG" typeref.IsGlobal = isGlobal; while (la.kind == 10) { lexer.NextToken(); -#line 1909 "VBNET.ATG" +#line 1931 "VBNET.ATG" TypeReference nestedTypeRef; QualIdentAndTypeArguments( -#line 1910 "VBNET.ATG" +#line 1932 "VBNET.ATG" out nestedTypeRef, canBeUnbound); -#line 1911 "VBNET.ATG" +#line 1933 "VBNET.ATG" typeref = new InnerClassTypeReference(typeref, nestedTypeRef.Type, nestedTypeRef.GenericTypes); } } else if (la.kind == 133) { lexer.NextToken(); -#line 1914 "VBNET.ATG" +#line 1936 "VBNET.ATG" typeref = new TypeReference("System.Object"); } else if (StartOf(9)) { PrimitiveTypeName( -#line 1915 "VBNET.ATG" +#line 1937 "VBNET.ATG" out name); -#line 1915 "VBNET.ATG" +#line 1937 "VBNET.ATG" typeref = new TypeReference(name); } else SynErr(218); } @@ -1150,27 +1150,27 @@ out f); } void InterfaceBase( -#line 1461 "VBNET.ATG" +#line 1455 "VBNET.ATG" out List bases) { -#line 1463 "VBNET.ATG" +#line 1457 "VBNET.ATG" TypeReference type; bases = new List(); Expect(110); TypeName( -#line 1467 "VBNET.ATG" +#line 1461 "VBNET.ATG" out type); -#line 1467 "VBNET.ATG" +#line 1461 "VBNET.ATG" bases.Add(type); while (la.kind == 12) { lexer.NextToken(); TypeName( -#line 1470 "VBNET.ATG" +#line 1464 "VBNET.ATG" out type); -#line 1470 "VBNET.ATG" +#line 1464 "VBNET.ATG" bases.Add(type); } Expect(1); @@ -1191,27 +1191,27 @@ TypeDeclaration newType) { } void FormalParameterList( -#line 2087 "VBNET.ATG" +#line 2109 "VBNET.ATG" List parameter) { -#line 2089 "VBNET.ATG" +#line 2111 "VBNET.ATG" ParameterDeclarationExpression p; AttributeSection section; List attributes = new List(); while (la.kind == 27) { AttributeSection( -#line 2093 "VBNET.ATG" +#line 2115 "VBNET.ATG" out section); -#line 2093 "VBNET.ATG" +#line 2115 "VBNET.ATG" attributes.Add(section); } FormalParameter( -#line 2095 "VBNET.ATG" +#line 2117 "VBNET.ATG" out p); -#line 2097 "VBNET.ATG" +#line 2119 "VBNET.ATG" bool paramsFound = false; p.Attributes = attributes; parameter.Add(p); @@ -1219,152 +1219,152 @@ out p); while (la.kind == 12) { lexer.NextToken(); -#line 2102 "VBNET.ATG" +#line 2124 "VBNET.ATG" if (paramsFound) Error("params array must be at end of parameter list"); while (la.kind == 27) { AttributeSection( -#line 2103 "VBNET.ATG" +#line 2125 "VBNET.ATG" out section); -#line 2103 "VBNET.ATG" +#line 2125 "VBNET.ATG" attributes.Add(section); } FormalParameter( -#line 2105 "VBNET.ATG" +#line 2127 "VBNET.ATG" out p); -#line 2105 "VBNET.ATG" +#line 2127 "VBNET.ATG" p.Attributes = attributes; parameter.Add(p); } } void MemberModifier( -#line 2787 "VBNET.ATG" +#line 2810 "VBNET.ATG" ModifierList m) { switch (la.kind) { case 122: { lexer.NextToken(); -#line 2788 "VBNET.ATG" +#line 2811 "VBNET.ATG" m.Add(Modifiers.Abstract, t.Location); break; } case 79: { lexer.NextToken(); -#line 2789 "VBNET.ATG" +#line 2812 "VBNET.ATG" m.Add(Modifiers.Default, t.Location); break; } case 99: { lexer.NextToken(); -#line 2790 "VBNET.ATG" +#line 2813 "VBNET.ATG" m.Add(Modifiers.Internal, t.Location); break; } case 157: { lexer.NextToken(); -#line 2791 "VBNET.ATG" +#line 2814 "VBNET.ATG" m.Add(Modifiers.New, t.Location); break; } case 142: { lexer.NextToken(); -#line 2792 "VBNET.ATG" +#line 2815 "VBNET.ATG" m.Add(Modifiers.Override, t.Location); break; } case 123: { lexer.NextToken(); -#line 2793 "VBNET.ATG" +#line 2816 "VBNET.ATG" m.Add(Modifiers.Abstract, t.Location); break; } case 145: { lexer.NextToken(); -#line 2794 "VBNET.ATG" +#line 2817 "VBNET.ATG" m.Add(Modifiers.Private, t.Location); break; } case 147: { lexer.NextToken(); -#line 2795 "VBNET.ATG" +#line 2818 "VBNET.ATG" m.Add(Modifiers.Protected, t.Location); break; } case 148: { lexer.NextToken(); -#line 2796 "VBNET.ATG" +#line 2819 "VBNET.ATG" m.Add(Modifiers.Public, t.Location); break; } case 131: { lexer.NextToken(); -#line 2797 "VBNET.ATG" +#line 2820 "VBNET.ATG" m.Add(Modifiers.Sealed, t.Location); break; } case 132: { lexer.NextToken(); -#line 2798 "VBNET.ATG" +#line 2821 "VBNET.ATG" m.Add(Modifiers.Sealed, t.Location); break; } case 158: { lexer.NextToken(); -#line 2799 "VBNET.ATG" +#line 2822 "VBNET.ATG" m.Add(Modifiers.Static, t.Location); break; } case 141: { lexer.NextToken(); -#line 2800 "VBNET.ATG" +#line 2823 "VBNET.ATG" m.Add(Modifiers.Virtual, t.Location); break; } case 140: { lexer.NextToken(); -#line 2801 "VBNET.ATG" +#line 2824 "VBNET.ATG" m.Add(Modifiers.Overloads, t.Location); break; } case 150: { lexer.NextToken(); -#line 2802 "VBNET.ATG" +#line 2825 "VBNET.ATG" m.Add(Modifiers.ReadOnly, t.Location); break; } case 184: { lexer.NextToken(); -#line 2803 "VBNET.ATG" +#line 2826 "VBNET.ATG" m.Add(Modifiers.WriteOnly, t.Location); break; } case 183: { lexer.NextToken(); -#line 2804 "VBNET.ATG" +#line 2827 "VBNET.ATG" m.Add(Modifiers.WithEvents, t.Location); break; } case 81: { lexer.NextToken(); -#line 2805 "VBNET.ATG" +#line 2828 "VBNET.ATG" m.Add(Modifiers.Dim, t.Location); break; } @@ -2362,91 +2362,91 @@ mod, attributes); } void Expr( -#line 1522 "VBNET.ATG" +#line 1516 "VBNET.ATG" out Expression expr) { DisjunctionExpr( -#line 1524 "VBNET.ATG" +#line 1518 "VBNET.ATG" out expr); } void ImplementsClause( -#line 1493 "VBNET.ATG" +#line 1487 "VBNET.ATG" out List baseInterfaces) { -#line 1495 "VBNET.ATG" +#line 1489 "VBNET.ATG" baseInterfaces = new List(); TypeReference type = null; string memberName = null; Expect(107); NonArrayTypeName( -#line 1500 "VBNET.ATG" +#line 1494 "VBNET.ATG" out type, false); -#line 1501 "VBNET.ATG" +#line 1495 "VBNET.ATG" if (type != null) memberName = TypeReference.StripLastIdentifierFromType(ref type); -#line 1502 "VBNET.ATG" +#line 1496 "VBNET.ATG" baseInterfaces.Add(new InterfaceImplementation(type, memberName)); while (la.kind == 12) { lexer.NextToken(); NonArrayTypeName( -#line 1504 "VBNET.ATG" +#line 1498 "VBNET.ATG" out type, false); -#line 1505 "VBNET.ATG" +#line 1499 "VBNET.ATG" if (type != null) memberName = TypeReference.StripLastIdentifierFromType(ref type); -#line 1506 "VBNET.ATG" +#line 1500 "VBNET.ATG" baseInterfaces.Add(new InterfaceImplementation(type, memberName)); } } void HandlesClause( -#line 1451 "VBNET.ATG" +#line 1445 "VBNET.ATG" out List handlesClause) { -#line 1453 "VBNET.ATG" +#line 1447 "VBNET.ATG" handlesClause = new List(); string name; Expect(105); EventMemberSpecifier( -#line 1456 "VBNET.ATG" +#line 1450 "VBNET.ATG" out name); -#line 1456 "VBNET.ATG" +#line 1450 "VBNET.ATG" handlesClause.Add(name); while (la.kind == 12) { lexer.NextToken(); EventMemberSpecifier( -#line 1457 "VBNET.ATG" +#line 1451 "VBNET.ATG" out name); -#line 1457 "VBNET.ATG" +#line 1451 "VBNET.ATG" handlesClause.Add(name); } } void Block( -#line 2143 "VBNET.ATG" +#line 2165 "VBNET.ATG" out Statement stmt) { -#line 2146 "VBNET.ATG" +#line 2168 "VBNET.ATG" BlockStatement blockStmt = new BlockStatement(); blockStmt.StartLocation = t.Location; compilationUnit.BlockStart(blockStmt); while (StartOf(19) || -#line 2151 "VBNET.ATG" +#line 2173 "VBNET.ATG" IsEndStmtAhead()) { if ( -#line 2151 "VBNET.ATG" +#line 2173 "VBNET.ATG" IsEndStmtAhead()) { Expect(88); EndOfStmt(); -#line 2151 "VBNET.ATG" +#line 2173 "VBNET.ATG" compilationUnit.AddChild(new EndStatement()); } else { Statement(); @@ -2454,7 +2454,7 @@ IsEndStmtAhead()) { } } -#line 2156 "VBNET.ATG" +#line 2178 "VBNET.ATG" stmt = blockStmt; blockStmt.EndLocation = t.EndLocation; compilationUnit.BlockEnd(); @@ -2462,26 +2462,26 @@ IsEndStmtAhead()) { } void Charset( -#line 1443 "VBNET.ATG" +#line 1437 "VBNET.ATG" out CharsetModifier charsetModifier) { -#line 1444 "VBNET.ATG" +#line 1438 "VBNET.ATG" charsetModifier = CharsetModifier.None; if (la.kind == 100 || la.kind == 167) { } else if (la.kind == 47) { lexer.NextToken(); -#line 1445 "VBNET.ATG" +#line 1439 "VBNET.ATG" charsetModifier = CharsetModifier.Ansi; } else if (la.kind == 50) { lexer.NextToken(); -#line 1446 "VBNET.ATG" +#line 1440 "VBNET.ATG" charsetModifier = CharsetModifier.Auto; } else if (la.kind == 176) { lexer.NextToken(); -#line 1447 "VBNET.ATG" +#line 1441 "VBNET.ATG" charsetModifier = CharsetModifier.Unicode; } else SynErr(229); } @@ -3075,31 +3075,31 @@ out stmt); } void PropertyAccessorAccessModifier( -#line 2808 "VBNET.ATG" +#line 2831 "VBNET.ATG" out Modifiers m) { -#line 2809 "VBNET.ATG" +#line 2832 "VBNET.ATG" m = Modifiers.None; while (StartOf(25)) { if (la.kind == 148) { lexer.NextToken(); -#line 2811 "VBNET.ATG" +#line 2834 "VBNET.ATG" m |= Modifiers.Public; } else if (la.kind == 147) { lexer.NextToken(); -#line 2812 "VBNET.ATG" +#line 2835 "VBNET.ATG" m |= Modifiers.Protected; } else if (la.kind == 99) { lexer.NextToken(); -#line 2813 "VBNET.ATG" +#line 2836 "VBNET.ATG" m |= Modifiers.Internal; } else { lexer.NextToken(); -#line 2814 "VBNET.ATG" +#line 2837 "VBNET.ATG" m |= Modifiers.Private; } } @@ -3120,59 +3120,63 @@ out arrayModifiers); } void ArrayNameModifier( -#line 1935 "VBNET.ATG" +#line 1957 "VBNET.ATG" out ArrayList arrayModifiers) { -#line 1937 "VBNET.ATG" +#line 1959 "VBNET.ATG" arrayModifiers = null; ArrayTypeModifiers( -#line 1939 "VBNET.ATG" +#line 1961 "VBNET.ATG" out arrayModifiers); } void ObjectCreateExpression( -#line 1816 "VBNET.ATG" +#line 1810 "VBNET.ATG" out Expression oce) { -#line 1818 "VBNET.ATG" +#line 1812 "VBNET.ATG" TypeReference type = null; Expression initializer = null; List arguments = null; ArrayList dimensions = null; oce = null; + bool canBeNormal; bool canBeReDim; Expect(127); NonArrayTypeName( -#line 1824 "VBNET.ATG" +#line 1819 "VBNET.ATG" out type, false); if (la.kind == 24) { lexer.NextToken(); - ArgumentList( -#line 1825 "VBNET.ATG" -out arguments); + NormalOrReDimArgumentList( +#line 1820 "VBNET.ATG" +out arguments, out canBeNormal, out canBeReDim); Expect(25); if (la.kind == 22 || -#line 1826 "VBNET.ATG" +#line 1821 "VBNET.ATG" la.kind == Tokens.OpenParenthesis) { if ( -#line 1826 "VBNET.ATG" +#line 1821 "VBNET.ATG" la.kind == Tokens.OpenParenthesis) { ArrayTypeModifiers( -#line 1827 "VBNET.ATG" +#line 1822 "VBNET.ATG" out dimensions); ArrayInitializer( -#line 1828 "VBNET.ATG" +#line 1823 "VBNET.ATG" out initializer); } else { ArrayInitializer( -#line 1829 "VBNET.ATG" +#line 1824 "VBNET.ATG" out initializer); } } + +#line 1826 "VBNET.ATG" + if (canBeReDim && !canBeNormal && initializer == null) initializer = new ArrayInitializerExpression(); } -#line 1832 "VBNET.ATG" +#line 1829 "VBNET.ATG" if (type == null) type = new TypeReference("Object"); // fallback type on parser errors if (initializer == null) { oce = new ObjectCreateExpression(type, arguments); @@ -3188,19 +3192,19 @@ out initializer); } void VariableInitializer( -#line 1415 "VBNET.ATG" +#line 1409 "VBNET.ATG" out Expression initializerExpression) { -#line 1417 "VBNET.ATG" +#line 1411 "VBNET.ATG" initializerExpression = null; if (StartOf(26)) { Expr( -#line 1419 "VBNET.ATG" +#line 1413 "VBNET.ATG" out initializerExpression); } else if (la.kind == 22) { ArrayInitializer( -#line 1420 "VBNET.ATG" +#line 1414 "VBNET.ATG" out initializerExpression); } else SynErr(235); } @@ -3219,89 +3223,85 @@ out expr); if (la.kind == 172) { lexer.NextToken(); -#line 1396 "VBNET.ATG" - if (!(expr is PrimitiveExpression) || (expr as PrimitiveExpression).StringValue != "0") - Error("lower bound of array must be zero"); - +#line 1395 "VBNET.ATG" + EnsureIsZero(expr); Expr( -#line 1399 "VBNET.ATG" +#line 1396 "VBNET.ATG" out expr); } -#line 1401 "VBNET.ATG" +#line 1398 "VBNET.ATG" if (expr != null) { rank.Add(expr); } while (la.kind == 12) { lexer.NextToken(); Expr( -#line 1403 "VBNET.ATG" +#line 1400 "VBNET.ATG" out expr); if (la.kind == 172) { lexer.NextToken(); -#line 1405 "VBNET.ATG" - if (!(expr is PrimitiveExpression) || (expr as PrimitiveExpression).StringValue != "0") - Error("lower bound of array must be zero"); - +#line 1401 "VBNET.ATG" + EnsureIsZero(expr); Expr( -#line 1408 "VBNET.ATG" +#line 1402 "VBNET.ATG" out expr); } -#line 1410 "VBNET.ATG" +#line 1404 "VBNET.ATG" if (expr != null) { rank.Add(expr); } } } void ArrayInitializer( -#line 1424 "VBNET.ATG" +#line 1418 "VBNET.ATG" out Expression outExpr) { -#line 1426 "VBNET.ATG" +#line 1420 "VBNET.ATG" Expression expr = null; ArrayInitializerExpression initializer = new ArrayInitializerExpression(); Expect(22); if (StartOf(27)) { VariableInitializer( -#line 1431 "VBNET.ATG" +#line 1425 "VBNET.ATG" out expr); -#line 1433 "VBNET.ATG" +#line 1427 "VBNET.ATG" if (expr != null) { initializer.CreateExpressions.Add(expr); } while ( -#line 1436 "VBNET.ATG" +#line 1430 "VBNET.ATG" NotFinalComma()) { Expect(12); VariableInitializer( -#line 1436 "VBNET.ATG" +#line 1430 "VBNET.ATG" out expr); -#line 1437 "VBNET.ATG" +#line 1431 "VBNET.ATG" if (expr != null) { initializer.CreateExpressions.Add(expr); } } } Expect(23); -#line 1440 "VBNET.ATG" +#line 1434 "VBNET.ATG" outExpr = initializer; } void EventMemberSpecifier( -#line 1510 "VBNET.ATG" +#line 1504 "VBNET.ATG" out string name) { -#line 1511 "VBNET.ATG" +#line 1505 "VBNET.ATG" string type; name = String.Empty; if (StartOf(12)) { Identifier(); -#line 1512 "VBNET.ATG" +#line 1506 "VBNET.ATG" type = t.val; Expect(10); Identifier(); -#line 1514 "VBNET.ATG" +#line 1508 "VBNET.ATG" name = type + "." + t.val; } else if (la.kind == 124) { lexer.NextToken(); @@ -3309,128 +3309,128 @@ out string name) { if (StartOf(12)) { Identifier(); -#line 1517 "VBNET.ATG" +#line 1511 "VBNET.ATG" name = "MyBase." + t.val; } else if (la.kind == 92) { lexer.NextToken(); -#line 1518 "VBNET.ATG" +#line 1512 "VBNET.ATG" name = "MyBase.Error"; } else SynErr(236); } else SynErr(237); } void DisjunctionExpr( -#line 1660 "VBNET.ATG" +#line 1654 "VBNET.ATG" out Expression outExpr) { -#line 1662 "VBNET.ATG" +#line 1656 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ConjunctionExpr( -#line 1665 "VBNET.ATG" +#line 1659 "VBNET.ATG" out outExpr); while (la.kind == 138 || la.kind == 139 || la.kind == 185) { if (la.kind == 138) { lexer.NextToken(); -#line 1668 "VBNET.ATG" +#line 1662 "VBNET.ATG" op = BinaryOperatorType.BitwiseOr; } else if (la.kind == 139) { lexer.NextToken(); -#line 1669 "VBNET.ATG" +#line 1663 "VBNET.ATG" op = BinaryOperatorType.LogicalOr; } else { lexer.NextToken(); -#line 1670 "VBNET.ATG" +#line 1664 "VBNET.ATG" op = BinaryOperatorType.ExclusiveOr; } ConjunctionExpr( -#line 1672 "VBNET.ATG" +#line 1666 "VBNET.ATG" out expr); -#line 1672 "VBNET.ATG" +#line 1666 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void AssignmentOperator( -#line 1527 "VBNET.ATG" +#line 1521 "VBNET.ATG" out AssignmentOperatorType op) { -#line 1528 "VBNET.ATG" +#line 1522 "VBNET.ATG" op = AssignmentOperatorType.None; switch (la.kind) { case 11: { lexer.NextToken(); -#line 1529 "VBNET.ATG" +#line 1523 "VBNET.ATG" op = AssignmentOperatorType.Assign; break; } case 41: { lexer.NextToken(); -#line 1530 "VBNET.ATG" +#line 1524 "VBNET.ATG" op = AssignmentOperatorType.ConcatString; break; } case 33: { lexer.NextToken(); -#line 1531 "VBNET.ATG" +#line 1525 "VBNET.ATG" op = AssignmentOperatorType.Add; break; } case 35: { lexer.NextToken(); -#line 1532 "VBNET.ATG" +#line 1526 "VBNET.ATG" op = AssignmentOperatorType.Subtract; break; } case 36: { lexer.NextToken(); -#line 1533 "VBNET.ATG" +#line 1527 "VBNET.ATG" op = AssignmentOperatorType.Multiply; break; } case 37: { lexer.NextToken(); -#line 1534 "VBNET.ATG" +#line 1528 "VBNET.ATG" op = AssignmentOperatorType.Divide; break; } case 38: { lexer.NextToken(); -#line 1535 "VBNET.ATG" +#line 1529 "VBNET.ATG" op = AssignmentOperatorType.DivideInteger; break; } case 34: { lexer.NextToken(); -#line 1536 "VBNET.ATG" +#line 1530 "VBNET.ATG" op = AssignmentOperatorType.Power; break; } case 39: { lexer.NextToken(); -#line 1537 "VBNET.ATG" +#line 1531 "VBNET.ATG" op = AssignmentOperatorType.ShiftLeft; break; } case 40: { lexer.NextToken(); -#line 1538 "VBNET.ATG" +#line 1532 "VBNET.ATG" op = AssignmentOperatorType.ShiftRight; break; } @@ -3439,10 +3439,36 @@ out AssignmentOperatorType op) { } void SimpleExpr( -#line 1542 "VBNET.ATG" +#line 1536 "VBNET.ATG" +out Expression pexpr) { + SimpleNonInvocationExpression( +#line 1538 "VBNET.ATG" +out pexpr); + while (la.kind == 10 || la.kind == 24) { + if (la.kind == 10) { + +#line 1539 "VBNET.ATG" + string name; + lexer.NextToken(); + IdentifierOrKeyword( +#line 1540 "VBNET.ATG" +out name); + +#line 1540 "VBNET.ATG" + pexpr = new FieldReferenceExpression(pexpr, name); + } else { + InvocationExpression( +#line 1541 "VBNET.ATG" +ref pexpr); + } + } + } + + void SimpleNonInvocationExpression( +#line 1545 "VBNET.ATG" out Expression pexpr) { -#line 1544 "VBNET.ATG" +#line 1547 "VBNET.ATG" Expression expr; TypeReference type = null; string name = String.Empty; @@ -3453,143 +3479,143 @@ out Expression pexpr) { case 3: { lexer.NextToken(); -#line 1552 "VBNET.ATG" +#line 1555 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 4: { lexer.NextToken(); -#line 1553 "VBNET.ATG" +#line 1556 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 7: { lexer.NextToken(); -#line 1554 "VBNET.ATG" +#line 1557 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 6: { lexer.NextToken(); -#line 1555 "VBNET.ATG" +#line 1558 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 5: { lexer.NextToken(); -#line 1556 "VBNET.ATG" +#line 1559 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 9: { lexer.NextToken(); -#line 1557 "VBNET.ATG" +#line 1560 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 8: { lexer.NextToken(); -#line 1558 "VBNET.ATG" +#line 1561 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 173: { lexer.NextToken(); -#line 1560 "VBNET.ATG" +#line 1563 "VBNET.ATG" pexpr = new PrimitiveExpression(true, "true"); break; } case 96: { lexer.NextToken(); -#line 1561 "VBNET.ATG" +#line 1564 "VBNET.ATG" pexpr = new PrimitiveExpression(false, "false"); break; } case 130: { lexer.NextToken(); -#line 1562 "VBNET.ATG" +#line 1565 "VBNET.ATG" pexpr = new PrimitiveExpression(null, "null"); break; } case 24: { lexer.NextToken(); Expr( -#line 1563 "VBNET.ATG" +#line 1566 "VBNET.ATG" out expr); Expect(25); -#line 1563 "VBNET.ATG" +#line 1566 "VBNET.ATG" pexpr = new ParenthesizedExpression(expr); break; } case 2: case 47: case 49: case 50: case 51: case 70: case 144: case 169: case 176: case 177: case 204: { Identifier(); -#line 1564 "VBNET.ATG" +#line 1567 "VBNET.ATG" pexpr = new IdentifierExpression(t.val); break; } case 52: case 54: case 65: case 76: case 77: case 84: case 111: case 117: case 133: case 159: case 160: case 165: case 190: case 191: case 192: case 193: { -#line 1565 "VBNET.ATG" +#line 1568 "VBNET.ATG" string val = String.Empty; if (StartOf(9)) { PrimitiveTypeName( -#line 1566 "VBNET.ATG" +#line 1569 "VBNET.ATG" out val); } else if (la.kind == 133) { lexer.NextToken(); -#line 1566 "VBNET.ATG" +#line 1569 "VBNET.ATG" val = "Object"; } else SynErr(239); Expect(10); -#line 1567 "VBNET.ATG" +#line 1570 "VBNET.ATG" t.val = ""; Identifier(); -#line 1567 "VBNET.ATG" +#line 1570 "VBNET.ATG" pexpr = new FieldReferenceExpression(new TypeReferenceExpression(val), t.val); break; } case 119: { lexer.NextToken(); -#line 1568 "VBNET.ATG" +#line 1571 "VBNET.ATG" pexpr = new ThisReferenceExpression(); break; } case 124: case 125: { -#line 1569 "VBNET.ATG" +#line 1572 "VBNET.ATG" Expression retExpr = null; if (la.kind == 124) { lexer.NextToken(); -#line 1570 "VBNET.ATG" +#line 1573 "VBNET.ATG" retExpr = new BaseReferenceExpression(); } else if (la.kind == 125) { lexer.NextToken(); -#line 1571 "VBNET.ATG" +#line 1574 "VBNET.ATG" retExpr = new ClassReferenceExpression(); } else SynErr(240); Expect(10); IdentifierOrKeyword( -#line 1573 "VBNET.ATG" +#line 1576 "VBNET.ATG" out name); -#line 1573 "VBNET.ATG" +#line 1576 "VBNET.ATG" pexpr = new FieldReferenceExpression(retExpr, name); break; } @@ -3598,77 +3624,77 @@ out name); Expect(10); Identifier(); -#line 1575 "VBNET.ATG" +#line 1578 "VBNET.ATG" type = new TypeReference(t.val ?? ""); -#line 1577 "VBNET.ATG" +#line 1580 "VBNET.ATG" type.IsGlobal = true; -#line 1578 "VBNET.ATG" +#line 1581 "VBNET.ATG" pexpr = new TypeReferenceExpression(type); break; } case 127: { ObjectCreateExpression( -#line 1579 "VBNET.ATG" +#line 1582 "VBNET.ATG" out expr); -#line 1579 "VBNET.ATG" +#line 1582 "VBNET.ATG" pexpr = expr; break; } case 75: case 82: case 199: { -#line 1581 "VBNET.ATG" +#line 1584 "VBNET.ATG" CastType castType = CastType.Cast; if (la.kind == 82) { lexer.NextToken(); } else if (la.kind == 75) { lexer.NextToken(); -#line 1583 "VBNET.ATG" +#line 1586 "VBNET.ATG" castType = CastType.Conversion; } else if (la.kind == 199) { lexer.NextToken(); -#line 1584 "VBNET.ATG" +#line 1587 "VBNET.ATG" castType = CastType.TryCast; } else SynErr(241); Expect(24); Expr( -#line 1586 "VBNET.ATG" +#line 1589 "VBNET.ATG" out expr); Expect(12); TypeName( -#line 1586 "VBNET.ATG" +#line 1589 "VBNET.ATG" out type); Expect(25); -#line 1587 "VBNET.ATG" +#line 1590 "VBNET.ATG" pexpr = new CastExpression(type, expr, castType); break; } case 59: case 60: case 61: case 62: case 63: case 64: case 66: case 68: case 69: case 72: case 73: case 74: case 194: case 195: case 196: case 197: { CastTarget( -#line 1588 "VBNET.ATG" +#line 1591 "VBNET.ATG" out type); Expect(24); Expr( -#line 1588 "VBNET.ATG" +#line 1591 "VBNET.ATG" out expr); Expect(25); -#line 1588 "VBNET.ATG" +#line 1591 "VBNET.ATG" pexpr = new CastExpression(type, expr, CastType.PrimitiveConversion); break; } case 43: { lexer.NextToken(); Expr( -#line 1589 "VBNET.ATG" +#line 1592 "VBNET.ATG" out expr); -#line 1589 "VBNET.ATG" +#line 1592 "VBNET.ATG" pexpr = new AddressOfExpression(expr); break; } @@ -3676,742 +3702,711 @@ out expr); lexer.NextToken(); Expect(24); GetTypeTypeName( -#line 1590 "VBNET.ATG" +#line 1593 "VBNET.ATG" out type); Expect(25); -#line 1590 "VBNET.ATG" +#line 1593 "VBNET.ATG" pexpr = new TypeOfExpression(type); break; } case 175: { lexer.NextToken(); SimpleExpr( -#line 1591 "VBNET.ATG" +#line 1594 "VBNET.ATG" out expr); Expect(113); TypeName( -#line 1591 "VBNET.ATG" +#line 1594 "VBNET.ATG" out type); -#line 1591 "VBNET.ATG" +#line 1594 "VBNET.ATG" pexpr = new TypeOfIsExpression(expr, type); break; } } - while (la.kind == 10 || la.kind == 24) { - InvocationOrMemberReferenceExpression( -#line 1593 "VBNET.ATG" -ref pexpr); - } } else if (la.kind == 10) { lexer.NextToken(); IdentifierOrKeyword( -#line 1596 "VBNET.ATG" +#line 1598 "VBNET.ATG" out name); -#line 1596 "VBNET.ATG" - pexpr = new FieldReferenceExpression(pexpr, name); - while (la.kind == 10 || la.kind == 24) { - InvocationOrMemberReferenceExpression( -#line 1597 "VBNET.ATG" -ref pexpr); - } +#line 1598 "VBNET.ATG" + pexpr = new FieldReferenceExpression(null, name); } else SynErr(242); } - void PrimitiveTypeName( -#line 2749 "VBNET.ATG" -out string type) { + void IdentifierOrKeyword( +#line 2765 "VBNET.ATG" +out string name) { -#line 2750 "VBNET.ATG" - type = String.Empty; - switch (la.kind) { - case 52: { +#line 2767 "VBNET.ATG" + lexer.NextToken(); name = t.val; + } + + void InvocationExpression( +#line 1602 "VBNET.ATG" +ref Expression pexpr) { + +#line 1603 "VBNET.ATG" + List typeParameters = new List(); + List parameters = null; + TypeReference type; + Expect(24); + +#line 1607 "VBNET.ATG" + Location start = t.Location; + if (la.kind == 200) { + lexer.NextToken(); + TypeName( +#line 1609 "VBNET.ATG" +out type); + +#line 1609 "VBNET.ATG" + if (type != null) typeParameters.Add(type); + while (la.kind == 12) { + lexer.NextToken(); + TypeName( +#line 1612 "VBNET.ATG" +out type); + +#line 1612 "VBNET.ATG" + if (type != null) typeParameters.Add(type); + } + Expect(25); + if (la.kind == 10) { + lexer.NextToken(); + Identifier(); + +#line 1617 "VBNET.ATG" + pexpr = new FieldReferenceExpression(GetTypeReferenceExpression(pexpr, typeParameters), t.val); + } else if (la.kind == 24) { + lexer.NextToken(); + ArgumentList( +#line 1619 "VBNET.ATG" +out parameters); + Expect(25); + +#line 1621 "VBNET.ATG" + pexpr = new InvocationExpression(pexpr, parameters, typeParameters); + } else SynErr(243); + } else if (StartOf(29)) { + ArgumentList( +#line 1623 "VBNET.ATG" +out parameters); + Expect(25); + +#line 1625 "VBNET.ATG" + pexpr = new InvocationExpression(pexpr, parameters, typeParameters); + } else SynErr(244); + +#line 1627 "VBNET.ATG" + pexpr.StartLocation = start; pexpr.EndLocation = t.Location; + } + + void PrimitiveTypeName( +#line 2772 "VBNET.ATG" +out string type) { + +#line 2773 "VBNET.ATG" + type = String.Empty; + switch (la.kind) { + case 52: { lexer.NextToken(); -#line 2751 "VBNET.ATG" +#line 2774 "VBNET.ATG" type = "Boolean"; break; } case 76: { lexer.NextToken(); -#line 2752 "VBNET.ATG" +#line 2775 "VBNET.ATG" type = "Date"; break; } case 65: { lexer.NextToken(); -#line 2753 "VBNET.ATG" +#line 2776 "VBNET.ATG" type = "Char"; break; } case 165: { lexer.NextToken(); -#line 2754 "VBNET.ATG" +#line 2777 "VBNET.ATG" type = "String"; break; } case 77: { lexer.NextToken(); -#line 2755 "VBNET.ATG" +#line 2778 "VBNET.ATG" type = "Decimal"; break; } case 54: { lexer.NextToken(); -#line 2756 "VBNET.ATG" +#line 2779 "VBNET.ATG" type = "Byte"; break; } case 159: { lexer.NextToken(); -#line 2757 "VBNET.ATG" +#line 2780 "VBNET.ATG" type = "Short"; break; } case 111: { lexer.NextToken(); -#line 2758 "VBNET.ATG" +#line 2781 "VBNET.ATG" type = "Integer"; break; } case 117: { lexer.NextToken(); -#line 2759 "VBNET.ATG" +#line 2782 "VBNET.ATG" type = "Long"; break; } case 160: { lexer.NextToken(); -#line 2760 "VBNET.ATG" +#line 2783 "VBNET.ATG" type = "Single"; break; } case 84: { lexer.NextToken(); -#line 2761 "VBNET.ATG" +#line 2784 "VBNET.ATG" type = "Double"; break; } case 191: { lexer.NextToken(); -#line 2762 "VBNET.ATG" +#line 2785 "VBNET.ATG" type = "UInteger"; break; } case 192: { lexer.NextToken(); -#line 2763 "VBNET.ATG" +#line 2786 "VBNET.ATG" type = "ULong"; break; } case 193: { lexer.NextToken(); -#line 2764 "VBNET.ATG" +#line 2787 "VBNET.ATG" type = "UShort"; break; } case 190: { lexer.NextToken(); -#line 2765 "VBNET.ATG" +#line 2788 "VBNET.ATG" type = "SByte"; break; } - default: SynErr(243); break; + default: SynErr(245); break; } } - void IdentifierOrKeyword( -#line 2742 "VBNET.ATG" -out string name) { - -#line 2744 "VBNET.ATG" - lexer.NextToken(); name = t.val; - } - void CastTarget( -#line 1638 "VBNET.ATG" +#line 1632 "VBNET.ATG" out TypeReference type) { -#line 1640 "VBNET.ATG" +#line 1634 "VBNET.ATG" type = null; switch (la.kind) { case 59: { lexer.NextToken(); -#line 1642 "VBNET.ATG" +#line 1636 "VBNET.ATG" type = new TypeReference("System.Boolean"); break; } case 60: { lexer.NextToken(); -#line 1643 "VBNET.ATG" +#line 1637 "VBNET.ATG" type = new TypeReference("System.Byte"); break; } case 194: { lexer.NextToken(); -#line 1644 "VBNET.ATG" +#line 1638 "VBNET.ATG" type = new TypeReference("System.SByte"); break; } case 61: { lexer.NextToken(); -#line 1645 "VBNET.ATG" +#line 1639 "VBNET.ATG" type = new TypeReference("System.Char"); break; } case 62: { lexer.NextToken(); -#line 1646 "VBNET.ATG" +#line 1640 "VBNET.ATG" type = new TypeReference("System.DateTime"); break; } case 64: { lexer.NextToken(); -#line 1647 "VBNET.ATG" +#line 1641 "VBNET.ATG" type = new TypeReference("System.Decimal"); break; } case 63: { lexer.NextToken(); -#line 1648 "VBNET.ATG" +#line 1642 "VBNET.ATG" type = new TypeReference("System.Double"); break; } case 72: { lexer.NextToken(); -#line 1649 "VBNET.ATG" +#line 1643 "VBNET.ATG" type = new TypeReference("System.Int16"); break; } case 66: { lexer.NextToken(); -#line 1650 "VBNET.ATG" +#line 1644 "VBNET.ATG" type = new TypeReference("System.Int32"); break; } case 68: { lexer.NextToken(); -#line 1651 "VBNET.ATG" +#line 1645 "VBNET.ATG" type = new TypeReference("System.Int64"); break; } case 195: { lexer.NextToken(); -#line 1652 "VBNET.ATG" +#line 1646 "VBNET.ATG" type = new TypeReference("System.UInt16"); break; } case 196: { lexer.NextToken(); -#line 1653 "VBNET.ATG" +#line 1647 "VBNET.ATG" type = new TypeReference("System.UInt32"); break; } case 197: { lexer.NextToken(); -#line 1654 "VBNET.ATG" +#line 1648 "VBNET.ATG" type = new TypeReference("System.UInt64"); break; } case 69: { lexer.NextToken(); -#line 1655 "VBNET.ATG" +#line 1649 "VBNET.ATG" type = new TypeReference("System.Object"); break; } case 73: { lexer.NextToken(); -#line 1656 "VBNET.ATG" +#line 1650 "VBNET.ATG" type = new TypeReference("System.Single"); break; } case 74: { lexer.NextToken(); -#line 1657 "VBNET.ATG" +#line 1651 "VBNET.ATG" type = new TypeReference("System.String"); break; } - default: SynErr(244); break; + default: SynErr(246); break; } } void GetTypeTypeName( -#line 1887 "VBNET.ATG" +#line 1909 "VBNET.ATG" out TypeReference typeref) { -#line 1888 "VBNET.ATG" +#line 1910 "VBNET.ATG" ArrayList rank = null; NonArrayTypeName( -#line 1890 "VBNET.ATG" +#line 1912 "VBNET.ATG" out typeref, true); ArrayTypeModifiers( -#line 1891 "VBNET.ATG" +#line 1913 "VBNET.ATG" out rank); -#line 1892 "VBNET.ATG" +#line 1914 "VBNET.ATG" if (rank != null && typeref != null) { typeref.RankSpecifier = (int[])rank.ToArray(typeof(int)); } } - void InvocationOrMemberReferenceExpression( -#line 1601 "VBNET.ATG" -ref Expression pexpr) { - -#line 1602 "VBNET.ATG" - string name; - if (la.kind == 10) { - lexer.NextToken(); - IdentifierOrKeyword( -#line 1604 "VBNET.ATG" -out name); - -#line 1604 "VBNET.ATG" - pexpr = new FieldReferenceExpression(pexpr, name); - } else if (la.kind == 24) { - InvocationExpression( -#line 1605 "VBNET.ATG" -ref pexpr); - } else SynErr(245); - } - - void InvocationExpression( -#line 1608 "VBNET.ATG" -ref Expression pexpr) { - -#line 1609 "VBNET.ATG" - List typeParameters = new List(); - List parameters = null; - TypeReference type; - Expect(24); - -#line 1613 "VBNET.ATG" - Location start = t.Location; - if (la.kind == 200) { - lexer.NextToken(); - TypeName( -#line 1615 "VBNET.ATG" -out type); - -#line 1615 "VBNET.ATG" - if (type != null) typeParameters.Add(type); - while (la.kind == 12) { - lexer.NextToken(); - TypeName( -#line 1618 "VBNET.ATG" -out type); - -#line 1618 "VBNET.ATG" - if (type != null) typeParameters.Add(type); - } - Expect(25); - if (la.kind == 10) { - lexer.NextToken(); - Identifier(); - -#line 1623 "VBNET.ATG" - pexpr = new FieldReferenceExpression(GetTypeReferenceExpression(pexpr, typeParameters), t.val); - } else if (la.kind == 24) { - lexer.NextToken(); - ArgumentList( -#line 1625 "VBNET.ATG" -out parameters); - Expect(25); - -#line 1627 "VBNET.ATG" - pexpr = new InvocationExpression(pexpr, parameters, typeParameters); - } else SynErr(246); - } else if (StartOf(29)) { - ArgumentList( -#line 1629 "VBNET.ATG" -out parameters); - Expect(25); - -#line 1631 "VBNET.ATG" - pexpr = new InvocationExpression(pexpr, parameters, typeParameters); - } else SynErr(247); - -#line 1633 "VBNET.ATG" - pexpr.StartLocation = start; pexpr.EndLocation = t.Location; - } - void ArgumentList( -#line 1847 "VBNET.ATG" +#line 1844 "VBNET.ATG" out List arguments) { -#line 1849 "VBNET.ATG" +#line 1846 "VBNET.ATG" arguments = new List(); Expression expr = null; if (StartOf(26)) { Argument( -#line 1852 "VBNET.ATG" +#line 1849 "VBNET.ATG" out expr); } while (la.kind == 12) { lexer.NextToken(); -#line 1853 "VBNET.ATG" +#line 1850 "VBNET.ATG" arguments.Add(expr ?? Expression.Null); expr = null; if (StartOf(26)) { Argument( -#line 1854 "VBNET.ATG" +#line 1851 "VBNET.ATG" out expr); } -#line 1855 "VBNET.ATG" +#line 1852 "VBNET.ATG" if (expr == null) expr = Expression.Null; } -#line 1857 "VBNET.ATG" +#line 1854 "VBNET.ATG" if (expr != null) arguments.Add(expr); } void ConjunctionExpr( -#line 1676 "VBNET.ATG" +#line 1670 "VBNET.ATG" out Expression outExpr) { -#line 1678 "VBNET.ATG" +#line 1672 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; NotExpr( -#line 1681 "VBNET.ATG" +#line 1675 "VBNET.ATG" out outExpr); while (la.kind == 45 || la.kind == 46) { if (la.kind == 45) { lexer.NextToken(); -#line 1684 "VBNET.ATG" +#line 1678 "VBNET.ATG" op = BinaryOperatorType.BitwiseAnd; } else { lexer.NextToken(); -#line 1685 "VBNET.ATG" +#line 1679 "VBNET.ATG" op = BinaryOperatorType.LogicalAnd; } NotExpr( -#line 1687 "VBNET.ATG" +#line 1681 "VBNET.ATG" out expr); -#line 1687 "VBNET.ATG" +#line 1681 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void NotExpr( -#line 1691 "VBNET.ATG" +#line 1685 "VBNET.ATG" out Expression outExpr) { -#line 1692 "VBNET.ATG" +#line 1686 "VBNET.ATG" UnaryOperatorType uop = UnaryOperatorType.None; while (la.kind == 129) { lexer.NextToken(); -#line 1693 "VBNET.ATG" +#line 1687 "VBNET.ATG" uop = UnaryOperatorType.Not; } ComparisonExpr( -#line 1694 "VBNET.ATG" +#line 1688 "VBNET.ATG" out outExpr); -#line 1695 "VBNET.ATG" +#line 1689 "VBNET.ATG" if (uop != UnaryOperatorType.None) outExpr = new UnaryOperatorExpression(outExpr, uop); } void ComparisonExpr( -#line 1700 "VBNET.ATG" +#line 1694 "VBNET.ATG" out Expression outExpr) { -#line 1702 "VBNET.ATG" +#line 1696 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ShiftExpr( -#line 1705 "VBNET.ATG" +#line 1699 "VBNET.ATG" out outExpr); while (StartOf(30)) { switch (la.kind) { case 27: { lexer.NextToken(); -#line 1708 "VBNET.ATG" +#line 1702 "VBNET.ATG" op = BinaryOperatorType.LessThan; break; } case 26: { lexer.NextToken(); -#line 1709 "VBNET.ATG" +#line 1703 "VBNET.ATG" op = BinaryOperatorType.GreaterThan; break; } case 30: { lexer.NextToken(); -#line 1710 "VBNET.ATG" +#line 1704 "VBNET.ATG" op = BinaryOperatorType.LessThanOrEqual; break; } case 29: { lexer.NextToken(); -#line 1711 "VBNET.ATG" +#line 1705 "VBNET.ATG" op = BinaryOperatorType.GreaterThanOrEqual; break; } case 28: { lexer.NextToken(); -#line 1712 "VBNET.ATG" +#line 1706 "VBNET.ATG" op = BinaryOperatorType.InEquality; break; } case 11: { lexer.NextToken(); -#line 1713 "VBNET.ATG" +#line 1707 "VBNET.ATG" op = BinaryOperatorType.Equality; break; } case 116: { lexer.NextToken(); -#line 1714 "VBNET.ATG" +#line 1708 "VBNET.ATG" op = BinaryOperatorType.Like; break; } case 113: { lexer.NextToken(); -#line 1715 "VBNET.ATG" +#line 1709 "VBNET.ATG" op = BinaryOperatorType.ReferenceEquality; break; } case 189: { lexer.NextToken(); -#line 1716 "VBNET.ATG" +#line 1710 "VBNET.ATG" op = BinaryOperatorType.ReferenceInequality; break; } } if (StartOf(31)) { ShiftExpr( -#line 1719 "VBNET.ATG" +#line 1713 "VBNET.ATG" out expr); -#line 1719 "VBNET.ATG" +#line 1713 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } else if (la.kind == 129) { lexer.NextToken(); ShiftExpr( -#line 1722 "VBNET.ATG" +#line 1716 "VBNET.ATG" out expr); -#line 1722 "VBNET.ATG" +#line 1716 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, new UnaryOperatorExpression(expr, UnaryOperatorType.Not)); - } else SynErr(248); + } else SynErr(247); } } void ShiftExpr( -#line 1727 "VBNET.ATG" +#line 1721 "VBNET.ATG" out Expression outExpr) { -#line 1729 "VBNET.ATG" +#line 1723 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ConcatenationExpr( -#line 1732 "VBNET.ATG" +#line 1726 "VBNET.ATG" out outExpr); while (la.kind == 31 || la.kind == 32) { if (la.kind == 31) { lexer.NextToken(); -#line 1735 "VBNET.ATG" +#line 1729 "VBNET.ATG" op = BinaryOperatorType.ShiftLeft; } else { lexer.NextToken(); -#line 1736 "VBNET.ATG" +#line 1730 "VBNET.ATG" op = BinaryOperatorType.ShiftRight; } ConcatenationExpr( -#line 1738 "VBNET.ATG" +#line 1732 "VBNET.ATG" out expr); -#line 1738 "VBNET.ATG" +#line 1732 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void ConcatenationExpr( -#line 1742 "VBNET.ATG" +#line 1736 "VBNET.ATG" out Expression outExpr) { -#line 1743 "VBNET.ATG" +#line 1737 "VBNET.ATG" Expression expr; AdditiveExpr( -#line 1745 "VBNET.ATG" +#line 1739 "VBNET.ATG" out outExpr); while (la.kind == 19) { lexer.NextToken(); AdditiveExpr( -#line 1745 "VBNET.ATG" +#line 1739 "VBNET.ATG" out expr); -#line 1745 "VBNET.ATG" +#line 1739 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.Concat, expr); } } void AdditiveExpr( -#line 1748 "VBNET.ATG" +#line 1742 "VBNET.ATG" out Expression outExpr) { -#line 1750 "VBNET.ATG" +#line 1744 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ModuloExpr( -#line 1753 "VBNET.ATG" +#line 1747 "VBNET.ATG" out outExpr); while (la.kind == 14 || la.kind == 15) { if (la.kind == 14) { lexer.NextToken(); -#line 1756 "VBNET.ATG" +#line 1750 "VBNET.ATG" op = BinaryOperatorType.Add; } else { lexer.NextToken(); -#line 1757 "VBNET.ATG" +#line 1751 "VBNET.ATG" op = BinaryOperatorType.Subtract; } ModuloExpr( -#line 1759 "VBNET.ATG" +#line 1753 "VBNET.ATG" out expr); -#line 1759 "VBNET.ATG" +#line 1753 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void ModuloExpr( -#line 1763 "VBNET.ATG" +#line 1757 "VBNET.ATG" out Expression outExpr) { -#line 1764 "VBNET.ATG" +#line 1758 "VBNET.ATG" Expression expr; IntegerDivisionExpr( -#line 1766 "VBNET.ATG" +#line 1760 "VBNET.ATG" out outExpr); while (la.kind == 120) { lexer.NextToken(); IntegerDivisionExpr( -#line 1766 "VBNET.ATG" +#line 1760 "VBNET.ATG" out expr); -#line 1766 "VBNET.ATG" +#line 1760 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.Modulus, expr); } } void IntegerDivisionExpr( -#line 1769 "VBNET.ATG" +#line 1763 "VBNET.ATG" out Expression outExpr) { -#line 1770 "VBNET.ATG" +#line 1764 "VBNET.ATG" Expression expr; MultiplicativeExpr( -#line 1772 "VBNET.ATG" +#line 1766 "VBNET.ATG" out outExpr); while (la.kind == 18) { lexer.NextToken(); MultiplicativeExpr( -#line 1772 "VBNET.ATG" +#line 1766 "VBNET.ATG" out expr); -#line 1772 "VBNET.ATG" +#line 1766 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.DivideInteger, expr); } } void MultiplicativeExpr( -#line 1775 "VBNET.ATG" +#line 1769 "VBNET.ATG" out Expression outExpr) { -#line 1777 "VBNET.ATG" +#line 1771 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; UnaryExpr( -#line 1780 "VBNET.ATG" +#line 1774 "VBNET.ATG" out outExpr); while (la.kind == 16 || la.kind == 17) { if (la.kind == 16) { lexer.NextToken(); -#line 1783 "VBNET.ATG" +#line 1777 "VBNET.ATG" op = BinaryOperatorType.Multiply; } else { lexer.NextToken(); -#line 1784 "VBNET.ATG" +#line 1778 "VBNET.ATG" op = BinaryOperatorType.Divide; } UnaryExpr( -#line 1786 "VBNET.ATG" +#line 1780 "VBNET.ATG" out expr); -#line 1786 "VBNET.ATG" +#line 1780 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void UnaryExpr( -#line 1790 "VBNET.ATG" +#line 1784 "VBNET.ATG" out Expression uExpr) { -#line 1792 "VBNET.ATG" +#line 1786 "VBNET.ATG" Expression expr; UnaryOperatorType uop = UnaryOperatorType.None; bool isUOp = false; @@ -4420,25 +4415,25 @@ out Expression uExpr) { if (la.kind == 14) { lexer.NextToken(); -#line 1796 "VBNET.ATG" +#line 1790 "VBNET.ATG" uop = UnaryOperatorType.Plus; isUOp = true; } else if (la.kind == 15) { lexer.NextToken(); -#line 1797 "VBNET.ATG" +#line 1791 "VBNET.ATG" uop = UnaryOperatorType.Minus; isUOp = true; } else { lexer.NextToken(); -#line 1798 "VBNET.ATG" +#line 1792 "VBNET.ATG" uop = UnaryOperatorType.Star; isUOp = true; } } ExponentiationExpr( -#line 1800 "VBNET.ATG" +#line 1794 "VBNET.ATG" out expr); -#line 1802 "VBNET.ATG" +#line 1796 "VBNET.ATG" if (isUOp) { uExpr = new UnaryOperatorExpression(expr, uop); } else { @@ -4448,50 +4443,107 @@ out expr); } void ExponentiationExpr( -#line 1810 "VBNET.ATG" +#line 1804 "VBNET.ATG" out Expression outExpr) { -#line 1811 "VBNET.ATG" +#line 1805 "VBNET.ATG" Expression expr; SimpleExpr( -#line 1813 "VBNET.ATG" +#line 1807 "VBNET.ATG" out outExpr); while (la.kind == 20) { lexer.NextToken(); SimpleExpr( -#line 1813 "VBNET.ATG" +#line 1807 "VBNET.ATG" out expr); -#line 1813 "VBNET.ATG" +#line 1807 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.Power, expr); } } + void NormalOrReDimArgumentList( +#line 1858 "VBNET.ATG" +out List arguments, out bool canBeNormal, out bool canBeRedim) { + +#line 1860 "VBNET.ATG" + arguments = new List(); + canBeNormal = true; canBeRedim = !IsNamedAssign(); + Expression expr = null; + + if (StartOf(26)) { + Argument( +#line 1865 "VBNET.ATG" +out expr); + if (la.kind == 172) { + lexer.NextToken(); + +#line 1866 "VBNET.ATG" + EnsureIsZero(expr); canBeNormal = false; + Expr( +#line 1867 "VBNET.ATG" +out expr); + } + } + while (la.kind == 12) { + lexer.NextToken(); + +#line 1870 "VBNET.ATG" + if (expr == null) canBeRedim = false; + +#line 1871 "VBNET.ATG" + arguments.Add(expr ?? Expression.Null); expr = null; + +#line 1872 "VBNET.ATG" + canBeRedim &= !IsNamedAssign(); + if (StartOf(26)) { + Argument( +#line 1873 "VBNET.ATG" +out expr); + if (la.kind == 172) { + lexer.NextToken(); + +#line 1874 "VBNET.ATG" + EnsureIsZero(expr); canBeNormal = false; + Expr( +#line 1875 "VBNET.ATG" +out expr); + } + } + +#line 1877 "VBNET.ATG" + if (expr == null) { canBeRedim = false; expr = Expression.Null; } + } + +#line 1879 "VBNET.ATG" + if (expr != null) arguments.Add(expr); else canBeRedim = false; + } + void ArrayTypeModifiers( -#line 1944 "VBNET.ATG" +#line 1966 "VBNET.ATG" out ArrayList arrayModifiers) { -#line 1946 "VBNET.ATG" +#line 1968 "VBNET.ATG" arrayModifiers = new ArrayList(); int i = 0; while ( -#line 1949 "VBNET.ATG" +#line 1971 "VBNET.ATG" IsDims()) { Expect(24); if (la.kind == 12 || la.kind == 25) { RankList( -#line 1951 "VBNET.ATG" +#line 1973 "VBNET.ATG" out i); } -#line 1953 "VBNET.ATG" +#line 1975 "VBNET.ATG" arrayModifiers.Add(i); Expect(25); } -#line 1958 "VBNET.ATG" +#line 1980 "VBNET.ATG" if(arrayModifiers.Count == 0) { arrayModifiers = null; } @@ -4499,118 +4551,118 @@ out i); } void Argument( -#line 1861 "VBNET.ATG" +#line 1883 "VBNET.ATG" out Expression argumentexpr) { -#line 1863 "VBNET.ATG" +#line 1885 "VBNET.ATG" Expression expr; argumentexpr = null; string name; if ( -#line 1867 "VBNET.ATG" +#line 1889 "VBNET.ATG" IsNamedAssign()) { Identifier(); -#line 1867 "VBNET.ATG" +#line 1889 "VBNET.ATG" name = t.val; Expect(13); Expect(11); Expr( -#line 1867 "VBNET.ATG" +#line 1889 "VBNET.ATG" out expr); -#line 1869 "VBNET.ATG" +#line 1891 "VBNET.ATG" argumentexpr = new NamedArgumentExpression(name, expr); } else if (StartOf(26)) { Expr( -#line 1872 "VBNET.ATG" +#line 1894 "VBNET.ATG" out argumentexpr); - } else SynErr(249); + } else SynErr(248); } void QualIdentAndTypeArguments( -#line 1918 "VBNET.ATG" +#line 1940 "VBNET.ATG" out TypeReference typeref, bool canBeUnbound) { -#line 1919 "VBNET.ATG" +#line 1941 "VBNET.ATG" string name; typeref = null; Qualident( -#line 1921 "VBNET.ATG" +#line 1943 "VBNET.ATG" out name); -#line 1922 "VBNET.ATG" +#line 1944 "VBNET.ATG" typeref = new TypeReference(name); if ( -#line 1923 "VBNET.ATG" +#line 1945 "VBNET.ATG" la.kind == Tokens.OpenParenthesis && Peek(1).kind == Tokens.Of) { lexer.NextToken(); Expect(200); if ( -#line 1925 "VBNET.ATG" +#line 1947 "VBNET.ATG" canBeUnbound && (la.kind == Tokens.CloseParenthesis || la.kind == Tokens.Comma)) { -#line 1926 "VBNET.ATG" +#line 1948 "VBNET.ATG" typeref.GenericTypes.Add(NullTypeReference.Instance); while (la.kind == 12) { lexer.NextToken(); -#line 1927 "VBNET.ATG" +#line 1949 "VBNET.ATG" typeref.GenericTypes.Add(NullTypeReference.Instance); } } else if (StartOf(5)) { TypeArgumentList( -#line 1928 "VBNET.ATG" +#line 1950 "VBNET.ATG" typeref.GenericTypes); - } else SynErr(250); + } else SynErr(249); Expect(25); } } void TypeArgumentList( -#line 1971 "VBNET.ATG" +#line 1993 "VBNET.ATG" List typeArguments) { -#line 1973 "VBNET.ATG" +#line 1995 "VBNET.ATG" TypeReference typeref; TypeName( -#line 1975 "VBNET.ATG" +#line 1997 "VBNET.ATG" out typeref); -#line 1975 "VBNET.ATG" +#line 1997 "VBNET.ATG" if (typeref != null) typeArguments.Add(typeref); while (la.kind == 12) { lexer.NextToken(); TypeName( -#line 1978 "VBNET.ATG" +#line 2000 "VBNET.ATG" out typeref); -#line 1978 "VBNET.ATG" +#line 2000 "VBNET.ATG" if (typeref != null) typeArguments.Add(typeref); } } void RankList( -#line 1965 "VBNET.ATG" +#line 1987 "VBNET.ATG" out int i) { -#line 1966 "VBNET.ATG" +#line 1988 "VBNET.ATG" i = 0; while (la.kind == 12) { lexer.NextToken(); -#line 1967 "VBNET.ATG" +#line 1989 "VBNET.ATG" ++i; } } void Attribute( -#line 2003 "VBNET.ATG" +#line 2025 "VBNET.ATG" out ASTAttribute attribute) { -#line 2004 "VBNET.ATG" +#line 2026 "VBNET.ATG" string name; List positional = new List(); List named = new List(); @@ -4620,39 +4672,39 @@ out ASTAttribute attribute) { Expect(10); } Qualident( -#line 2009 "VBNET.ATG" +#line 2031 "VBNET.ATG" out name); if (la.kind == 24) { AttributeArguments( -#line 2010 "VBNET.ATG" +#line 2032 "VBNET.ATG" positional, named); } -#line 2011 "VBNET.ATG" +#line 2033 "VBNET.ATG" attribute = new ASTAttribute(name, positional, named); } void AttributeArguments( -#line 2015 "VBNET.ATG" +#line 2037 "VBNET.ATG" List positional, List named) { -#line 2017 "VBNET.ATG" +#line 2039 "VBNET.ATG" bool nameFound = false; string name = ""; Expression expr; Expect(24); if ( -#line 2023 "VBNET.ATG" +#line 2045 "VBNET.ATG" IsNotClosingParenthesis()) { if ( -#line 2025 "VBNET.ATG" +#line 2047 "VBNET.ATG" IsNamedAssign()) { -#line 2025 "VBNET.ATG" +#line 2047 "VBNET.ATG" nameFound = true; IdentifierOrKeyword( -#line 2026 "VBNET.ATG" +#line 2048 "VBNET.ATG" out name); if (la.kind == 13) { lexer.NextToken(); @@ -4660,10 +4712,10 @@ out name); Expect(11); } Expr( -#line 2028 "VBNET.ATG" +#line 2050 "VBNET.ATG" out expr); -#line 2030 "VBNET.ATG" +#line 2052 "VBNET.ATG" if (expr != null) { if (string.IsNullOrEmpty(name)) { positional.Add(expr); } else { named.Add(new NamedArgumentExpression(name, expr)); name = ""; } @@ -4672,13 +4724,13 @@ out expr); while (la.kind == 12) { lexer.NextToken(); if ( -#line 2038 "VBNET.ATG" +#line 2060 "VBNET.ATG" IsNamedAssign()) { -#line 2038 "VBNET.ATG" +#line 2060 "VBNET.ATG" nameFound = true; IdentifierOrKeyword( -#line 2039 "VBNET.ATG" +#line 2061 "VBNET.ATG" out name); if (la.kind == 13) { lexer.NextToken(); @@ -4686,14 +4738,14 @@ out name); Expect(11); } else if (StartOf(26)) { -#line 2041 "VBNET.ATG" +#line 2063 "VBNET.ATG" if (nameFound) Error("no positional argument after named argument"); - } else SynErr(251); + } else SynErr(250); Expr( -#line 2042 "VBNET.ATG" +#line 2064 "VBNET.ATG" out expr); -#line 2042 "VBNET.ATG" +#line 2064 "VBNET.ATG" if (expr != null) { if(name == "") positional.Add(expr); else { named.Add(new NamedArgumentExpression(name, expr)); name = ""; } } @@ -4704,10 +4756,10 @@ out expr); } void FormalParameter( -#line 2111 "VBNET.ATG" +#line 2133 "VBNET.ATG" out ParameterDeclarationExpression p) { -#line 2113 "VBNET.ATG" +#line 2135 "VBNET.ATG" TypeReference type = null; ParamModifierList mod = new ParamModifierList(this); Expression expr = null; @@ -4715,28 +4767,28 @@ out ParameterDeclarationExpression p) { while (StartOf(32)) { ParameterModifier( -#line 2118 "VBNET.ATG" +#line 2140 "VBNET.ATG" mod); } Identifier(); -#line 2119 "VBNET.ATG" +#line 2141 "VBNET.ATG" string parameterName = t.val; if ( -#line 2120 "VBNET.ATG" +#line 2142 "VBNET.ATG" IsDims()) { ArrayTypeModifiers( -#line 2120 "VBNET.ATG" +#line 2142 "VBNET.ATG" out arrayModifiers); } if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 2121 "VBNET.ATG" +#line 2143 "VBNET.ATG" out type); } -#line 2123 "VBNET.ATG" +#line 2145 "VBNET.ATG" if(type != null) { if (arrayModifiers != null) { if (type.RankSpecifier != null) { @@ -4752,45 +4804,45 @@ out type); if (la.kind == 11) { lexer.NextToken(); Expr( -#line 2135 "VBNET.ATG" +#line 2157 "VBNET.ATG" out expr); } -#line 2137 "VBNET.ATG" +#line 2159 "VBNET.ATG" mod.Check(); p = new ParameterDeclarationExpression(type, parameterName, mod.Modifier, expr); } void ParameterModifier( -#line 2768 "VBNET.ATG" +#line 2791 "VBNET.ATG" ParamModifierList m) { if (la.kind == 55) { lexer.NextToken(); -#line 2769 "VBNET.ATG" +#line 2792 "VBNET.ATG" m.Add(ParameterModifiers.In); } else if (la.kind == 53) { lexer.NextToken(); -#line 2770 "VBNET.ATG" +#line 2793 "VBNET.ATG" m.Add(ParameterModifiers.Ref); } else if (la.kind == 137) { lexer.NextToken(); -#line 2771 "VBNET.ATG" +#line 2794 "VBNET.ATG" m.Add(ParameterModifiers.Optional); } else if (la.kind == 143) { lexer.NextToken(); -#line 2772 "VBNET.ATG" +#line 2795 "VBNET.ATG" m.Add(ParameterModifiers.Params); - } else SynErr(252); + } else SynErr(251); } void Statement() { -#line 2164 "VBNET.ATG" +#line 2186 "VBNET.ATG" Statement stmt = null; Location startPos = la.Location; string label = String.Empty; @@ -4798,34 +4850,34 @@ ParamModifierList m) { if (la.kind == 1 || la.kind == 13) { } else if ( -#line 2170 "VBNET.ATG" +#line 2192 "VBNET.ATG" IsLabel()) { LabelName( -#line 2170 "VBNET.ATG" +#line 2192 "VBNET.ATG" out label); -#line 2172 "VBNET.ATG" +#line 2194 "VBNET.ATG" compilationUnit.AddChild(new LabelStatement(t.val)); Expect(13); Statement(); } else if (StartOf(33)) { EmbeddedStatement( -#line 2175 "VBNET.ATG" +#line 2197 "VBNET.ATG" out stmt); -#line 2175 "VBNET.ATG" +#line 2197 "VBNET.ATG" compilationUnit.AddChild(stmt); } else if (StartOf(34)) { LocalDeclarationStatement( -#line 2176 "VBNET.ATG" +#line 2198 "VBNET.ATG" out stmt); -#line 2176 "VBNET.ATG" +#line 2198 "VBNET.ATG" compilationUnit.AddChild(stmt); - } else SynErr(253); + } else SynErr(252); -#line 2179 "VBNET.ATG" +#line 2201 "VBNET.ATG" if (stmt != null) { stmt.StartLocation = startPos; stmt.EndLocation = t.Location; @@ -4834,30 +4886,30 @@ out stmt); } void LabelName( -#line 2555 "VBNET.ATG" +#line 2577 "VBNET.ATG" out string name) { -#line 2557 "VBNET.ATG" +#line 2579 "VBNET.ATG" name = String.Empty; if (StartOf(12)) { Identifier(); -#line 2559 "VBNET.ATG" +#line 2581 "VBNET.ATG" name = t.val; } else if (la.kind == 5) { lexer.NextToken(); -#line 2560 "VBNET.ATG" +#line 2582 "VBNET.ATG" name = t.val; - } else SynErr(254); + } else SynErr(253); } void EmbeddedStatement( -#line 2218 "VBNET.ATG" +#line 2240 "VBNET.ATG" out Statement statement) { -#line 2220 "VBNET.ATG" +#line 2242 "VBNET.ATG" Statement embeddedStatement = null; statement = null; Expression expr = null; @@ -4868,103 +4920,103 @@ out Statement statement) { case 94: { lexer.NextToken(); -#line 2226 "VBNET.ATG" +#line 2248 "VBNET.ATG" ExitType exitType = ExitType.None; switch (la.kind) { case 167: { lexer.NextToken(); -#line 2228 "VBNET.ATG" +#line 2250 "VBNET.ATG" exitType = ExitType.Sub; break; } case 100: { lexer.NextToken(); -#line 2230 "VBNET.ATG" +#line 2252 "VBNET.ATG" exitType = ExitType.Function; break; } case 146: { lexer.NextToken(); -#line 2232 "VBNET.ATG" +#line 2254 "VBNET.ATG" exitType = ExitType.Property; break; } case 83: { lexer.NextToken(); -#line 2234 "VBNET.ATG" +#line 2256 "VBNET.ATG" exitType = ExitType.Do; break; } case 98: { lexer.NextToken(); -#line 2236 "VBNET.ATG" +#line 2258 "VBNET.ATG" exitType = ExitType.For; break; } case 174: { lexer.NextToken(); -#line 2238 "VBNET.ATG" +#line 2260 "VBNET.ATG" exitType = ExitType.Try; break; } case 181: { lexer.NextToken(); -#line 2240 "VBNET.ATG" +#line 2262 "VBNET.ATG" exitType = ExitType.While; break; } case 155: { lexer.NextToken(); -#line 2242 "VBNET.ATG" +#line 2264 "VBNET.ATG" exitType = ExitType.Select; break; } - default: SynErr(255); break; + default: SynErr(254); break; } -#line 2244 "VBNET.ATG" +#line 2266 "VBNET.ATG" statement = new ExitStatement(exitType); break; } case 174: { TryStatement( -#line 2245 "VBNET.ATG" +#line 2267 "VBNET.ATG" out statement); break; } case 186: { lexer.NextToken(); -#line 2246 "VBNET.ATG" +#line 2268 "VBNET.ATG" ContinueType continueType = ContinueType.None; if (la.kind == 83 || la.kind == 98 || la.kind == 181) { if (la.kind == 83) { lexer.NextToken(); -#line 2246 "VBNET.ATG" +#line 2268 "VBNET.ATG" continueType = ContinueType.Do; } else if (la.kind == 98) { lexer.NextToken(); -#line 2246 "VBNET.ATG" +#line 2268 "VBNET.ATG" continueType = ContinueType.For; } else { lexer.NextToken(); -#line 2246 "VBNET.ATG" +#line 2268 "VBNET.ATG" continueType = ContinueType.While; } } -#line 2246 "VBNET.ATG" +#line 2268 "VBNET.ATG" statement = new ContinueStatement(continueType); break; } @@ -4972,11 +5024,11 @@ out statement); lexer.NextToken(); if (StartOf(26)) { Expr( -#line 2248 "VBNET.ATG" +#line 2270 "VBNET.ATG" out expr); } -#line 2248 "VBNET.ATG" +#line 2270 "VBNET.ATG" statement = new ThrowStatement(expr); break; } @@ -4984,27 +5036,27 @@ out expr); lexer.NextToken(); if (StartOf(26)) { Expr( -#line 2250 "VBNET.ATG" +#line 2272 "VBNET.ATG" out expr); } -#line 2250 "VBNET.ATG" +#line 2272 "VBNET.ATG" statement = new ReturnStatement(expr); break; } case 168: { lexer.NextToken(); Expr( -#line 2252 "VBNET.ATG" +#line 2274 "VBNET.ATG" out expr); EndOfStmt(); Block( -#line 2252 "VBNET.ATG" +#line 2274 "VBNET.ATG" out embeddedStatement); Expect(88); Expect(168); -#line 2253 "VBNET.ATG" +#line 2275 "VBNET.ATG" statement = new LockStatement(expr, embeddedStatement); break; } @@ -5012,42 +5064,42 @@ out embeddedStatement); lexer.NextToken(); Identifier(); -#line 2255 "VBNET.ATG" +#line 2277 "VBNET.ATG" name = t.val; if (la.kind == 24) { lexer.NextToken(); if (StartOf(29)) { ArgumentList( -#line 2256 "VBNET.ATG" +#line 2278 "VBNET.ATG" out p); } Expect(25); } -#line 2257 "VBNET.ATG" +#line 2279 "VBNET.ATG" statement = new RaiseEventStatement(name, p); break; } case 182: { WithStatement( -#line 2259 "VBNET.ATG" +#line 2281 "VBNET.ATG" out statement); break; } case 42: { lexer.NextToken(); -#line 2261 "VBNET.ATG" +#line 2283 "VBNET.ATG" Expression handlerExpr = null; Expr( -#line 2262 "VBNET.ATG" +#line 2284 "VBNET.ATG" out expr); Expect(12); Expr( -#line 2262 "VBNET.ATG" +#line 2284 "VBNET.ATG" out handlerExpr); -#line 2264 "VBNET.ATG" +#line 2286 "VBNET.ATG" statement = new AddHandlerStatement(expr, handlerExpr); break; @@ -5055,17 +5107,17 @@ out handlerExpr); case 152: { lexer.NextToken(); -#line 2267 "VBNET.ATG" +#line 2289 "VBNET.ATG" Expression handlerExpr = null; Expr( -#line 2268 "VBNET.ATG" +#line 2290 "VBNET.ATG" out expr); Expect(12); Expr( -#line 2268 "VBNET.ATG" +#line 2290 "VBNET.ATG" out handlerExpr); -#line 2270 "VBNET.ATG" +#line 2292 "VBNET.ATG" statement = new RemoveHandlerStatement(expr, handlerExpr); break; @@ -5073,16 +5125,16 @@ out handlerExpr); case 181: { lexer.NextToken(); Expr( -#line 2273 "VBNET.ATG" +#line 2295 "VBNET.ATG" out expr); EndOfStmt(); Block( -#line 2274 "VBNET.ATG" +#line 2296 "VBNET.ATG" out embeddedStatement); Expect(88); Expect(181); -#line 2276 "VBNET.ATG" +#line 2298 "VBNET.ATG" statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.Start); break; @@ -5090,23 +5142,23 @@ out embeddedStatement); case 83: { lexer.NextToken(); -#line 2281 "VBNET.ATG" +#line 2303 "VBNET.ATG" ConditionType conditionType = ConditionType.None; if (la.kind == 177 || la.kind == 181) { WhileOrUntil( -#line 2284 "VBNET.ATG" +#line 2306 "VBNET.ATG" out conditionType); Expr( -#line 2284 "VBNET.ATG" +#line 2306 "VBNET.ATG" out expr); EndOfStmt(); Block( -#line 2285 "VBNET.ATG" +#line 2307 "VBNET.ATG" out embeddedStatement); Expect(118); -#line 2288 "VBNET.ATG" +#line 2310 "VBNET.ATG" statement = new DoLoopStatement(expr, embeddedStatement, conditionType == ConditionType.While ? ConditionType.DoWhile : conditionType, @@ -5115,28 +5167,28 @@ out embeddedStatement); } else if (la.kind == 1 || la.kind == 13) { EndOfStmt(); Block( -#line 2295 "VBNET.ATG" +#line 2317 "VBNET.ATG" out embeddedStatement); Expect(118); if (la.kind == 177 || la.kind == 181) { WhileOrUntil( -#line 2296 "VBNET.ATG" +#line 2318 "VBNET.ATG" out conditionType); Expr( -#line 2296 "VBNET.ATG" +#line 2318 "VBNET.ATG" out expr); } -#line 2298 "VBNET.ATG" +#line 2320 "VBNET.ATG" statement = new DoLoopStatement(expr, embeddedStatement, conditionType, ConditionPosition.End); - } else SynErr(256); + } else SynErr(255); break; } case 98: { lexer.NextToken(); -#line 2303 "VBNET.ATG" +#line 2325 "VBNET.ATG" Expression group = null; TypeReference typeReference; string typeName; @@ -5145,24 +5197,24 @@ out expr); if (la.kind == 85) { lexer.NextToken(); LoopControlVariable( -#line 2310 "VBNET.ATG" +#line 2332 "VBNET.ATG" out typeReference, out typeName); Expect(109); Expr( -#line 2311 "VBNET.ATG" +#line 2333 "VBNET.ATG" out group); EndOfStmt(); Block( -#line 2312 "VBNET.ATG" +#line 2334 "VBNET.ATG" out embeddedStatement); Expect(128); if (StartOf(26)) { Expr( -#line 2313 "VBNET.ATG" +#line 2335 "VBNET.ATG" out expr); } -#line 2315 "VBNET.ATG" +#line 2337 "VBNET.ATG" statement = new ForeachStatement(typeReference, typeName, group, @@ -5174,84 +5226,84 @@ out expr); } else if (StartOf(12)) { -#line 2326 "VBNET.ATG" +#line 2348 "VBNET.ATG" Expression start = null; Expression end = null; Expression step = null; Expression nextExpr = null;List nextExpressions = null; LoopControlVariable( -#line 2331 "VBNET.ATG" +#line 2353 "VBNET.ATG" out typeReference, out typeName); Expect(11); Expr( -#line 2332 "VBNET.ATG" +#line 2354 "VBNET.ATG" out start); Expect(172); Expr( -#line 2332 "VBNET.ATG" +#line 2354 "VBNET.ATG" out end); if (la.kind == 162) { lexer.NextToken(); Expr( -#line 2332 "VBNET.ATG" +#line 2354 "VBNET.ATG" out step); } EndOfStmt(); Block( -#line 2333 "VBNET.ATG" +#line 2355 "VBNET.ATG" out embeddedStatement); Expect(128); if (StartOf(26)) { Expr( -#line 2336 "VBNET.ATG" +#line 2358 "VBNET.ATG" out nextExpr); -#line 2336 "VBNET.ATG" +#line 2358 "VBNET.ATG" nextExpressions = new List(); nextExpressions.Add(nextExpr); while (la.kind == 12) { lexer.NextToken(); Expr( -#line 2337 "VBNET.ATG" +#line 2359 "VBNET.ATG" out nextExpr); -#line 2337 "VBNET.ATG" +#line 2359 "VBNET.ATG" nextExpressions.Add(nextExpr); } } -#line 2340 "VBNET.ATG" +#line 2362 "VBNET.ATG" statement = new ForNextStatement(typeReference, typeName, start, end, step, embeddedStatement, nextExpressions); - } else SynErr(257); + } else SynErr(256); break; } case 92: { lexer.NextToken(); Expr( -#line 2344 "VBNET.ATG" +#line 2366 "VBNET.ATG" out expr); -#line 2344 "VBNET.ATG" +#line 2366 "VBNET.ATG" statement = new ErrorStatement(expr); break; } case 151: { lexer.NextToken(); -#line 2346 "VBNET.ATG" +#line 2368 "VBNET.ATG" bool isPreserve = false; if (la.kind == 144) { lexer.NextToken(); -#line 2346 "VBNET.ATG" +#line 2368 "VBNET.ATG" isPreserve = true; } - Expr( -#line 2347 "VBNET.ATG" + ReDimClause( +#line 2369 "VBNET.ATG" out expr); -#line 2349 "VBNET.ATG" +#line 2371 "VBNET.ATG" ReDimStatement reDimStatement = new ReDimStatement(isPreserve); statement = reDimStatement; InvocationExpression redimClause = expr as InvocationExpression; @@ -5259,14 +5311,14 @@ out expr); while (la.kind == 12) { lexer.NextToken(); - Expr( -#line 2354 "VBNET.ATG" + ReDimClause( +#line 2376 "VBNET.ATG" out expr); -#line 2355 "VBNET.ATG" +#line 2377 "VBNET.ATG" redimClause = expr as InvocationExpression; -#line 2356 "VBNET.ATG" +#line 2378 "VBNET.ATG" if (redimClause != null) { reDimStatement.ReDimClauses.Add(redimClause); } } break; @@ -5274,10 +5326,10 @@ out expr); case 91: { lexer.NextToken(); Expr( -#line 2360 "VBNET.ATG" +#line 2382 "VBNET.ATG" out expr); -#line 2361 "VBNET.ATG" +#line 2383 "VBNET.ATG" List arrays = new List(); if (expr != null) { arrays.Add(expr);} EraseStatement eraseStatement = new EraseStatement(arrays); @@ -5286,53 +5338,53 @@ out expr); while (la.kind == 12) { lexer.NextToken(); Expr( -#line 2366 "VBNET.ATG" +#line 2388 "VBNET.ATG" out expr); -#line 2366 "VBNET.ATG" +#line 2388 "VBNET.ATG" if (expr != null) { arrays.Add(expr); } } -#line 2367 "VBNET.ATG" +#line 2389 "VBNET.ATG" statement = eraseStatement; break; } case 163: { lexer.NextToken(); -#line 2369 "VBNET.ATG" +#line 2391 "VBNET.ATG" statement = new StopStatement(); break; } case 106: { lexer.NextToken(); Expr( -#line 2371 "VBNET.ATG" +#line 2393 "VBNET.ATG" out expr); if (la.kind == 170) { lexer.NextToken(); } if ( -#line 2373 "VBNET.ATG" +#line 2395 "VBNET.ATG" IsEndStmtAhead()) { Expect(88); -#line 2373 "VBNET.ATG" +#line 2395 "VBNET.ATG" statement = new IfElseStatement(expr, new EndStatement()); } else if (la.kind == 1 || la.kind == 13) { EndOfStmt(); Block( -#line 2376 "VBNET.ATG" +#line 2398 "VBNET.ATG" out embeddedStatement); -#line 2378 "VBNET.ATG" +#line 2400 "VBNET.ATG" IfElseStatement ifStatement = new IfElseStatement(expr, embeddedStatement); while (la.kind == 87 || -#line 2382 "VBNET.ATG" +#line 2404 "VBNET.ATG" IsElseIf()) { if ( -#line 2382 "VBNET.ATG" +#line 2404 "VBNET.ATG" IsElseIf()) { Expect(86); Expect(106); @@ -5340,20 +5392,20 @@ IsElseIf()) { lexer.NextToken(); } -#line 2385 "VBNET.ATG" +#line 2407 "VBNET.ATG" Expression condition = null; Statement block = null; Expr( -#line 2386 "VBNET.ATG" +#line 2408 "VBNET.ATG" out condition); if (la.kind == 170) { lexer.NextToken(); } EndOfStmt(); Block( -#line 2387 "VBNET.ATG" +#line 2409 "VBNET.ATG" out block); -#line 2389 "VBNET.ATG" +#line 2411 "VBNET.ATG" ifStatement.ElseIfSections.Add(new ElseIfSection(condition, block)); } @@ -5361,61 +5413,61 @@ out block); lexer.NextToken(); EndOfStmt(); Block( -#line 2394 "VBNET.ATG" +#line 2416 "VBNET.ATG" out embeddedStatement); -#line 2396 "VBNET.ATG" +#line 2418 "VBNET.ATG" ifStatement.FalseStatement.Add(embeddedStatement); } Expect(88); Expect(106); -#line 2400 "VBNET.ATG" +#line 2422 "VBNET.ATG" statement = ifStatement; } else if (StartOf(33)) { EmbeddedStatement( -#line 2403 "VBNET.ATG" +#line 2425 "VBNET.ATG" out embeddedStatement); -#line 2405 "VBNET.ATG" +#line 2427 "VBNET.ATG" IfElseStatement ifStatement = new IfElseStatement(expr, embeddedStatement); while (la.kind == 13) { lexer.NextToken(); EmbeddedStatement( -#line 2407 "VBNET.ATG" +#line 2429 "VBNET.ATG" out embeddedStatement); -#line 2407 "VBNET.ATG" +#line 2429 "VBNET.ATG" ifStatement.TrueStatement.Add(embeddedStatement); } if (la.kind == 86) { lexer.NextToken(); if (StartOf(33)) { EmbeddedStatement( -#line 2409 "VBNET.ATG" +#line 2431 "VBNET.ATG" out embeddedStatement); } -#line 2411 "VBNET.ATG" +#line 2433 "VBNET.ATG" ifStatement.FalseStatement.Add(embeddedStatement); while (la.kind == 13) { lexer.NextToken(); EmbeddedStatement( -#line 2414 "VBNET.ATG" +#line 2436 "VBNET.ATG" out embeddedStatement); -#line 2415 "VBNET.ATG" +#line 2437 "VBNET.ATG" ifStatement.FalseStatement.Add(embeddedStatement); } } -#line 2418 "VBNET.ATG" +#line 2440 "VBNET.ATG" statement = ifStatement; - } else SynErr(258); + } else SynErr(257); break; } case 155: { @@ -5424,43 +5476,43 @@ out embeddedStatement); lexer.NextToken(); } Expr( -#line 2421 "VBNET.ATG" +#line 2443 "VBNET.ATG" out expr); EndOfStmt(); -#line 2422 "VBNET.ATG" +#line 2444 "VBNET.ATG" List selectSections = new List(); Statement block = null; while (la.kind == 57) { -#line 2426 "VBNET.ATG" +#line 2448 "VBNET.ATG" List caseClauses = null; lexer.NextToken(); CaseClauses( -#line 2427 "VBNET.ATG" +#line 2449 "VBNET.ATG" out caseClauses); if ( -#line 2427 "VBNET.ATG" +#line 2449 "VBNET.ATG" IsNotStatementSeparator()) { lexer.NextToken(); } EndOfStmt(); -#line 2429 "VBNET.ATG" +#line 2451 "VBNET.ATG" SwitchSection selectSection = new SwitchSection(caseClauses); Block( -#line 2431 "VBNET.ATG" +#line 2453 "VBNET.ATG" out block); -#line 2433 "VBNET.ATG" +#line 2455 "VBNET.ATG" selectSection.Children = block.Children; selectSections.Add(selectSection); } -#line 2437 "VBNET.ATG" +#line 2459 "VBNET.ATG" statement = new SwitchStatement(expr, selectSections); Expect(88); Expect(155); @@ -5468,43 +5520,43 @@ out block); } case 135: { -#line 2439 "VBNET.ATG" +#line 2461 "VBNET.ATG" OnErrorStatement onErrorStatement = null; OnErrorStatement( -#line 2440 "VBNET.ATG" +#line 2462 "VBNET.ATG" out onErrorStatement); -#line 2440 "VBNET.ATG" +#line 2462 "VBNET.ATG" statement = onErrorStatement; break; } case 104: { -#line 2441 "VBNET.ATG" +#line 2463 "VBNET.ATG" GotoStatement goToStatement = null; GotoStatement( -#line 2442 "VBNET.ATG" +#line 2464 "VBNET.ATG" out goToStatement); -#line 2442 "VBNET.ATG" +#line 2464 "VBNET.ATG" statement = goToStatement; break; } case 153: { -#line 2443 "VBNET.ATG" +#line 2465 "VBNET.ATG" ResumeStatement resumeStatement = null; ResumeStatement( -#line 2444 "VBNET.ATG" +#line 2466 "VBNET.ATG" out resumeStatement); -#line 2444 "VBNET.ATG" +#line 2466 "VBNET.ATG" statement = resumeStatement; break; } case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 24: case 43: case 47: case 49: case 50: case 51: case 52: case 54: case 59: case 60: case 61: case 62: case 63: case 64: case 65: case 66: case 68: case 69: case 70: case 72: case 73: case 74: case 75: case 76: case 77: case 82: case 84: case 96: case 102: case 111: case 117: case 119: case 124: case 125: case 127: case 130: case 133: case 144: case 159: case 160: case 165: case 169: case 173: case 175: case 176: case 177: case 190: case 191: case 192: case 193: case 194: case 195: case 196: case 197: case 198: case 199: case 204: { -#line 2447 "VBNET.ATG" +#line 2469 "VBNET.ATG" Expression val = null; AssignmentOperatorType op; @@ -5512,25 +5564,25 @@ out resumeStatement); la.kind == Tokens.Not || la.kind == Tokens.Times; SimpleExpr( -#line 2453 "VBNET.ATG" +#line 2475 "VBNET.ATG" out expr); if (StartOf(35)) { AssignmentOperator( -#line 2455 "VBNET.ATG" +#line 2477 "VBNET.ATG" out op); Expr( -#line 2455 "VBNET.ATG" +#line 2477 "VBNET.ATG" out val); -#line 2455 "VBNET.ATG" +#line 2477 "VBNET.ATG" expr = new AssignmentExpression(expr, op, val); } else if (la.kind == 1 || la.kind == 13 || la.kind == 86) { -#line 2456 "VBNET.ATG" +#line 2478 "VBNET.ATG" if (mustBeAssignment) Error("error in assignment."); - } else SynErr(259); + } else SynErr(258); -#line 2459 "VBNET.ATG" +#line 2481 "VBNET.ATG" // a field reference expression that stands alone is a // invocation expression without parantheses and arguments if(expr is FieldReferenceExpression || expr is IdentifierExpression) { @@ -5543,63 +5595,63 @@ out val); case 56: { lexer.NextToken(); SimpleExpr( -#line 2466 "VBNET.ATG" +#line 2488 "VBNET.ATG" out expr); -#line 2466 "VBNET.ATG" +#line 2488 "VBNET.ATG" statement = new ExpressionStatement(expr); break; } case 188: { lexer.NextToken(); -#line 2468 "VBNET.ATG" +#line 2490 "VBNET.ATG" Statement block; if ( -#line 2469 "VBNET.ATG" +#line 2491 "VBNET.ATG" Peek(1).kind == Tokens.As) { -#line 2470 "VBNET.ATG" +#line 2492 "VBNET.ATG" LocalVariableDeclaration resourceAquisition = new LocalVariableDeclaration(Modifiers.None); VariableDeclarator( -#line 2471 "VBNET.ATG" +#line 2493 "VBNET.ATG" resourceAquisition.Variables); while (la.kind == 12) { lexer.NextToken(); VariableDeclarator( -#line 2473 "VBNET.ATG" +#line 2495 "VBNET.ATG" resourceAquisition.Variables); } Block( -#line 2475 "VBNET.ATG" +#line 2497 "VBNET.ATG" out block); -#line 2476 "VBNET.ATG" +#line 2498 "VBNET.ATG" statement = new UsingStatement(resourceAquisition, block); } else if (StartOf(26)) { Expr( -#line 2477 "VBNET.ATG" +#line 2499 "VBNET.ATG" out expr); Block( -#line 2478 "VBNET.ATG" +#line 2500 "VBNET.ATG" out block); -#line 2479 "VBNET.ATG" +#line 2501 "VBNET.ATG" statement = new UsingStatement(new ExpressionStatement(expr), block); - } else SynErr(260); + } else SynErr(259); Expect(88); Expect(188); break; } - default: SynErr(261); break; + default: SynErr(260); break; } } void LocalDeclarationStatement( -#line 2187 "VBNET.ATG" +#line 2209 "VBNET.ATG" out Statement statement) { -#line 2189 "VBNET.ATG" +#line 2211 "VBNET.ATG" ModifierList m = new ModifierList(); LocalVariableDeclaration localVariableDeclaration; bool dimfound = false; @@ -5608,22 +5660,22 @@ out Statement statement) { if (la.kind == 71) { lexer.NextToken(); -#line 2195 "VBNET.ATG" +#line 2217 "VBNET.ATG" m.Add(Modifiers.Const, t.Location); } else if (la.kind == 161) { lexer.NextToken(); -#line 2196 "VBNET.ATG" +#line 2218 "VBNET.ATG" m.Add(Modifiers.Static, t.Location); } else { lexer.NextToken(); -#line 2197 "VBNET.ATG" +#line 2219 "VBNET.ATG" dimfound = true; } } -#line 2200 "VBNET.ATG" +#line 2222 "VBNET.ATG" if(dimfound && (m.Modifier & Modifiers.Const) != 0) { Error("Dim is not allowed on constants."); } @@ -5636,135 +5688,135 @@ out Statement statement) { localVariableDeclaration.StartLocation = t.Location; VariableDeclarator( -#line 2211 "VBNET.ATG" +#line 2233 "VBNET.ATG" localVariableDeclaration.Variables); while (la.kind == 12) { lexer.NextToken(); VariableDeclarator( -#line 2212 "VBNET.ATG" +#line 2234 "VBNET.ATG" localVariableDeclaration.Variables); } -#line 2214 "VBNET.ATG" +#line 2236 "VBNET.ATG" statement = localVariableDeclaration; } void TryStatement( -#line 2665 "VBNET.ATG" +#line 2688 "VBNET.ATG" out Statement tryStatement) { -#line 2667 "VBNET.ATG" +#line 2690 "VBNET.ATG" Statement blockStmt = null, finallyStmt = null;List catchClauses = null; Expect(174); EndOfStmt(); Block( -#line 2670 "VBNET.ATG" +#line 2693 "VBNET.ATG" out blockStmt); if (la.kind == 58 || la.kind == 88 || la.kind == 97) { CatchClauses( -#line 2671 "VBNET.ATG" +#line 2694 "VBNET.ATG" out catchClauses); } if (la.kind == 97) { lexer.NextToken(); EndOfStmt(); Block( -#line 2672 "VBNET.ATG" +#line 2695 "VBNET.ATG" out finallyStmt); } Expect(88); Expect(174); -#line 2675 "VBNET.ATG" +#line 2698 "VBNET.ATG" tryStatement = new TryCatchStatement(blockStmt, catchClauses, finallyStmt); } void WithStatement( -#line 2645 "VBNET.ATG" +#line 2668 "VBNET.ATG" out Statement withStatement) { -#line 2647 "VBNET.ATG" +#line 2670 "VBNET.ATG" Statement blockStmt = null; Expression expr = null; Expect(182); -#line 2650 "VBNET.ATG" +#line 2673 "VBNET.ATG" Location start = t.Location; Expr( -#line 2651 "VBNET.ATG" +#line 2674 "VBNET.ATG" out expr); EndOfStmt(); -#line 2653 "VBNET.ATG" +#line 2676 "VBNET.ATG" withStatement = new WithStatement(expr); withStatement.StartLocation = start; Block( -#line 2656 "VBNET.ATG" +#line 2679 "VBNET.ATG" out blockStmt); -#line 2658 "VBNET.ATG" +#line 2681 "VBNET.ATG" ((WithStatement)withStatement).Body = (BlockStatement)blockStmt; Expect(88); Expect(182); -#line 2661 "VBNET.ATG" +#line 2684 "VBNET.ATG" withStatement.EndLocation = t.Location; } void WhileOrUntil( -#line 2638 "VBNET.ATG" +#line 2661 "VBNET.ATG" out ConditionType conditionType) { -#line 2639 "VBNET.ATG" +#line 2662 "VBNET.ATG" conditionType = ConditionType.None; if (la.kind == 181) { lexer.NextToken(); -#line 2640 "VBNET.ATG" +#line 2663 "VBNET.ATG" conditionType = ConditionType.While; } else if (la.kind == 177) { lexer.NextToken(); -#line 2641 "VBNET.ATG" +#line 2664 "VBNET.ATG" conditionType = ConditionType.Until; - } else SynErr(262); + } else SynErr(261); } void LoopControlVariable( -#line 2485 "VBNET.ATG" +#line 2507 "VBNET.ATG" out TypeReference type, out string name) { -#line 2486 "VBNET.ATG" +#line 2508 "VBNET.ATG" ArrayList arrayModifiers = null; type = null; Qualident( -#line 2490 "VBNET.ATG" +#line 2512 "VBNET.ATG" out name); if ( -#line 2491 "VBNET.ATG" +#line 2513 "VBNET.ATG" IsDims()) { ArrayTypeModifiers( -#line 2491 "VBNET.ATG" +#line 2513 "VBNET.ATG" out arrayModifiers); } if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 2492 "VBNET.ATG" +#line 2514 "VBNET.ATG" out type); -#line 2492 "VBNET.ATG" +#line 2514 "VBNET.ATG" if (name.IndexOf('.') > 0) { Error("No type def for 'for each' member indexer allowed."); } } -#line 2494 "VBNET.ATG" +#line 2516 "VBNET.ATG" if (type != null) { if(type.RankSpecifier != null && arrayModifiers != null) { Error("array rank only allowed one time"); @@ -5775,49 +5827,60 @@ out type); } + void ReDimClause( +#line 2586 "VBNET.ATG" +out Expression expr) { + SimpleNonInvocationExpression( +#line 2588 "VBNET.ATG" +out expr); + ReDimClauseInternal( +#line 2589 "VBNET.ATG" +ref expr); + } + void CaseClauses( -#line 2598 "VBNET.ATG" +#line 2621 "VBNET.ATG" out List caseClauses) { -#line 2600 "VBNET.ATG" +#line 2623 "VBNET.ATG" caseClauses = new List(); CaseLabel caseClause = null; CaseClause( -#line 2603 "VBNET.ATG" +#line 2626 "VBNET.ATG" out caseClause); -#line 2603 "VBNET.ATG" +#line 2626 "VBNET.ATG" if (caseClause != null) { caseClauses.Add(caseClause); } while (la.kind == 12) { lexer.NextToken(); CaseClause( -#line 2604 "VBNET.ATG" +#line 2627 "VBNET.ATG" out caseClause); -#line 2604 "VBNET.ATG" +#line 2627 "VBNET.ATG" if (caseClause != null) { caseClauses.Add(caseClause); } } } void OnErrorStatement( -#line 2505 "VBNET.ATG" +#line 2527 "VBNET.ATG" out OnErrorStatement stmt) { -#line 2507 "VBNET.ATG" +#line 2529 "VBNET.ATG" stmt = null; GotoStatement goToStatement = null; Expect(135); Expect(92); if ( -#line 2513 "VBNET.ATG" +#line 2535 "VBNET.ATG" IsNegativeLabelName()) { Expect(104); Expect(15); Expect(5); -#line 2515 "VBNET.ATG" +#line 2537 "VBNET.ATG" long intLabel = Int64.Parse(t.val); if(intLabel != 1) { Error("invalid label in on error statement."); @@ -5826,10 +5889,10 @@ IsNegativeLabelName()) { } else if (la.kind == 104) { GotoStatement( -#line 2521 "VBNET.ATG" +#line 2543 "VBNET.ATG" out goToStatement); -#line 2523 "VBNET.ATG" +#line 2545 "VBNET.ATG" string val = goToStatement.Label; // if value is numeric, make sure that is 0 @@ -5846,63 +5909,100 @@ out goToStatement); lexer.NextToken(); Expect(128); -#line 2537 "VBNET.ATG" +#line 2559 "VBNET.ATG" stmt = new OnErrorStatement(new ResumeStatement(true)); - } else SynErr(263); + } else SynErr(262); } void GotoStatement( -#line 2543 "VBNET.ATG" +#line 2565 "VBNET.ATG" out GotoStatement goToStatement) { -#line 2545 "VBNET.ATG" +#line 2567 "VBNET.ATG" string label = String.Empty; Expect(104); LabelName( -#line 2548 "VBNET.ATG" +#line 2570 "VBNET.ATG" out label); -#line 2550 "VBNET.ATG" +#line 2572 "VBNET.ATG" goToStatement = new GotoStatement(label); } void ResumeStatement( -#line 2587 "VBNET.ATG" +#line 2610 "VBNET.ATG" out ResumeStatement resumeStatement) { -#line 2589 "VBNET.ATG" +#line 2612 "VBNET.ATG" resumeStatement = null; string label = String.Empty; if ( -#line 2592 "VBNET.ATG" +#line 2615 "VBNET.ATG" IsResumeNext()) { Expect(153); Expect(128); -#line 2593 "VBNET.ATG" +#line 2616 "VBNET.ATG" resumeStatement = new ResumeStatement(true); } else if (la.kind == 153) { lexer.NextToken(); if (StartOf(36)) { LabelName( -#line 2594 "VBNET.ATG" +#line 2617 "VBNET.ATG" out label); } -#line 2594 "VBNET.ATG" +#line 2617 "VBNET.ATG" resumeStatement = new ResumeStatement(label); - } else SynErr(264); + } else SynErr(263); + } + + void ReDimClauseInternal( +#line 2592 "VBNET.ATG" +ref Expression expr) { + +#line 2593 "VBNET.ATG" + List arguments; bool canBeNormal; bool canBeRedim; string name; + while (la.kind == 10 || +#line 2596 "VBNET.ATG" +la.kind == Tokens.OpenParenthesis && Peek(1).kind == Tokens.Of) { + if (la.kind == 10) { + lexer.NextToken(); + IdentifierOrKeyword( +#line 2595 "VBNET.ATG" +out name); + +#line 2595 "VBNET.ATG" + expr = new FieldReferenceExpression(expr, name); + } else { + InvocationExpression( +#line 2597 "VBNET.ATG" +ref expr); + } + } + Expect(24); + NormalOrReDimArgumentList( +#line 2600 "VBNET.ATG" +out arguments, out canBeNormal, out canBeRedim); + Expect(25); + +#line 2602 "VBNET.ATG" + expr = new InvocationExpression(expr, arguments); + if (canBeRedim == false || canBeNormal && (la.kind == Tokens.Dot || la.kind == Tokens.OpenParenthesis)) { + ReDimClauseInternal(ref expr); + } + } void CaseClause( -#line 2608 "VBNET.ATG" +#line 2631 "VBNET.ATG" out CaseLabel caseClause) { -#line 2610 "VBNET.ATG" +#line 2633 "VBNET.ATG" Expression expr = null; Expression sexpr = null; BinaryOperatorType op = BinaryOperatorType.None; @@ -5911,7 +6011,7 @@ out CaseLabel caseClause) { if (la.kind == 86) { lexer.NextToken(); -#line 2616 "VBNET.ATG" +#line 2639 "VBNET.ATG" caseClause = new CaseLabel(); } else if (StartOf(37)) { if (la.kind == 113) { @@ -5921,76 +6021,76 @@ out CaseLabel caseClause) { case 27: { lexer.NextToken(); -#line 2620 "VBNET.ATG" +#line 2643 "VBNET.ATG" op = BinaryOperatorType.LessThan; break; } case 26: { lexer.NextToken(); -#line 2621 "VBNET.ATG" +#line 2644 "VBNET.ATG" op = BinaryOperatorType.GreaterThan; break; } case 30: { lexer.NextToken(); -#line 2622 "VBNET.ATG" +#line 2645 "VBNET.ATG" op = BinaryOperatorType.LessThanOrEqual; break; } case 29: { lexer.NextToken(); -#line 2623 "VBNET.ATG" +#line 2646 "VBNET.ATG" op = BinaryOperatorType.GreaterThanOrEqual; break; } case 11: { lexer.NextToken(); -#line 2624 "VBNET.ATG" +#line 2647 "VBNET.ATG" op = BinaryOperatorType.Equality; break; } case 28: { lexer.NextToken(); -#line 2625 "VBNET.ATG" +#line 2648 "VBNET.ATG" op = BinaryOperatorType.InEquality; break; } - default: SynErr(265); break; + default: SynErr(264); break; } Expr( -#line 2627 "VBNET.ATG" +#line 2650 "VBNET.ATG" out expr); -#line 2629 "VBNET.ATG" +#line 2652 "VBNET.ATG" caseClause = new CaseLabel(op, expr); } else if (StartOf(26)) { Expr( -#line 2631 "VBNET.ATG" +#line 2654 "VBNET.ATG" out expr); if (la.kind == 172) { lexer.NextToken(); Expr( -#line 2631 "VBNET.ATG" +#line 2654 "VBNET.ATG" out sexpr); } -#line 2633 "VBNET.ATG" +#line 2656 "VBNET.ATG" caseClause = new CaseLabel(expr, sexpr); - } else SynErr(266); + } else SynErr(265); } void CatchClauses( -#line 2680 "VBNET.ATG" +#line 2703 "VBNET.ATG" out List catchClauses) { -#line 2682 "VBNET.ATG" +#line 2705 "VBNET.ATG" catchClauses = new List(); TypeReference type = null; Statement blockStmt = null; @@ -6002,27 +6102,27 @@ out List catchClauses) { if (StartOf(12)) { Identifier(); -#line 2690 "VBNET.ATG" +#line 2713 "VBNET.ATG" name = t.val; if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 2690 "VBNET.ATG" +#line 2713 "VBNET.ATG" out type); } } if (la.kind == 180) { lexer.NextToken(); Expr( -#line 2691 "VBNET.ATG" +#line 2714 "VBNET.ATG" out expr); } EndOfStmt(); Block( -#line 2693 "VBNET.ATG" +#line 2716 "VBNET.ATG" out blockStmt); -#line 2694 "VBNET.ATG" +#line 2717 "VBNET.ATG" catchClauses.Add(new CatchClause(type, name, blockStmt, expr)); } } @@ -6278,34 +6378,33 @@ out blockStmt); case 236: s = "invalid EventMemberSpecifier"; break; case 237: s = "invalid EventMemberSpecifier"; break; case 238: s = "invalid AssignmentOperator"; break; - case 239: s = "invalid SimpleExpr"; break; - case 240: s = "invalid SimpleExpr"; break; - case 241: s = "invalid SimpleExpr"; break; - case 242: s = "invalid SimpleExpr"; break; - case 243: s = "invalid PrimitiveTypeName"; break; - case 244: s = "invalid CastTarget"; break; - case 245: s = "invalid InvocationOrMemberReferenceExpression"; break; - case 246: s = "invalid InvocationExpression"; break; - case 247: s = "invalid InvocationExpression"; break; - case 248: s = "invalid ComparisonExpr"; break; - case 249: s = "invalid Argument"; break; - case 250: s = "invalid QualIdentAndTypeArguments"; break; - case 251: s = "invalid AttributeArguments"; break; - case 252: s = "invalid ParameterModifier"; break; - case 253: s = "invalid Statement"; break; - case 254: s = "invalid LabelName"; break; + case 239: s = "invalid SimpleNonInvocationExpression"; break; + case 240: s = "invalid SimpleNonInvocationExpression"; break; + case 241: s = "invalid SimpleNonInvocationExpression"; break; + case 242: s = "invalid SimpleNonInvocationExpression"; break; + case 243: s = "invalid InvocationExpression"; break; + case 244: s = "invalid InvocationExpression"; break; + case 245: s = "invalid PrimitiveTypeName"; break; + case 246: s = "invalid CastTarget"; break; + case 247: s = "invalid ComparisonExpr"; break; + case 248: s = "invalid Argument"; break; + case 249: s = "invalid QualIdentAndTypeArguments"; break; + case 250: s = "invalid AttributeArguments"; break; + case 251: s = "invalid ParameterModifier"; break; + case 252: s = "invalid Statement"; break; + case 253: s = "invalid LabelName"; break; + case 254: s = "invalid EmbeddedStatement"; break; case 255: s = "invalid EmbeddedStatement"; break; case 256: s = "invalid EmbeddedStatement"; break; case 257: s = "invalid EmbeddedStatement"; break; case 258: s = "invalid EmbeddedStatement"; break; case 259: s = "invalid EmbeddedStatement"; break; case 260: s = "invalid EmbeddedStatement"; break; - case 261: s = "invalid EmbeddedStatement"; break; - case 262: s = "invalid WhileOrUntil"; break; - case 263: s = "invalid OnErrorStatement"; break; - case 264: s = "invalid ResumeStatement"; break; + case 261: s = "invalid WhileOrUntil"; break; + case 262: s = "invalid OnErrorStatement"; break; + case 263: s = "invalid ResumeStatement"; break; + case 264: s = "invalid CaseClause"; break; case 265: s = "invalid CaseClause"; break; - case 266: s = "invalid CaseClause"; break; default: s = "error " + errorNumber; break; } diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG index d02ca2048e..21571b2515 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG @@ -1392,19 +1392,13 @@ InitializationRankList rank> Expression expr = null; .) = Expr - [ "To" - (. if (!(expr is PrimitiveExpression) || (expr as PrimitiveExpression).StringValue != "0") - Error("lower bound of array must be zero"); - .) + [ "To" (. EnsureIsZero(expr); .) Expr ] (. if (expr != null) { rank.Add(expr); } .) { "," Expr - [ "To" - (. if (!(expr is PrimitiveExpression) || (expr as PrimitiveExpression).StringValue != "0") - Error("lower bound of array must be zero"); - .) + [ "To" (. EnsureIsZero(expr); .) Expr ] (. if (expr != null) { rank.Add(expr); } .) @@ -1540,6 +1534,15 @@ AssignmentOperator /* 11.4 */ SimpleExpr += + SimpleNonInvocationExpression + { (. string name; .) + "." IdentifierOrKeyword (. pexpr = new FieldReferenceExpression(pexpr, name); .) + | InvocationExpression + } +. + +SimpleNonInvocationExpression (. Expression expr; TypeReference type = null; @@ -1590,21 +1593,12 @@ SimpleExpr | /* 11.5.1 */ "GetType" "(" GetTypeTypeName ")" (. pexpr = new TypeOfExpression(type); .) | /* 11.5.2 */ "TypeOf" SimpleExpr "Is" TypeName (. pexpr = new TypeOfIsExpression(expr, type); .) ) - { InvocationOrMemberReferenceExpression } | /* this form only occurs in WithStatements*/ - "." IdentifierOrKeyword (. pexpr = new FieldReferenceExpression(pexpr, name);.) - { InvocationOrMemberReferenceExpression } + "." IdentifierOrKeyword (. pexpr = new FieldReferenceExpression(null, name);.) ) . -InvocationOrMemberReferenceExpression -(. string name; .) -= - "." IdentifierOrKeyword (. pexpr = new FieldReferenceExpression(pexpr, name); .) -| InvocationExpression -. - InvocationExpression (. List typeParameters = new List(); List parameters = null; @@ -1820,13 +1814,16 @@ ObjectCreateExpression List arguments = null; ArrayList dimensions = null; oce = null; + bool canBeNormal; bool canBeReDim; .) = "New" NonArrayTypeName - ["(" ArgumentList ")" + ["(" NormalOrReDimArgumentList ")" [ IF (la.kind == Tokens.OpenParenthesis) - ArrayTypeModifiers - ArrayInitializer - | ArrayInitializer ] + ArrayTypeModifiers + ArrayInitializer + | ArrayInitializer + ] + (. if (canBeReDim && !canBeNormal && initializer == null) initializer = new ArrayInitializerExpression(); .) ] (. if (type == null) type = new TypeReference("Object"); // fallback type on parser errors @@ -1857,6 +1854,31 @@ ArgumentList arguments> (. if (expr != null) arguments.Add(expr); .) . +/* argument list that hasn't decided if it is method call or array initialisation */ +NormalOrReDimArgumentList arguments, out bool canBeNormal, out bool canBeRedim> + (. + arguments = new List(); + canBeNormal = true; canBeRedim = !IsNamedAssign(); + Expression expr = null; + .) += + [ Argument + [ "To" (. EnsureIsZero(expr); canBeNormal = false; .) + Expr + ] ] + { "," + (. if (expr == null) canBeRedim = false; .) + (. arguments.Add(expr ?? Expression.Null); expr = null; .) + (. canBeRedim &= !IsNamedAssign(); .) + [ Argument + [ "To" (. EnsureIsZero(expr); canBeNormal = false; .) + Expr + ] ] + (. if (expr == null) { canBeRedim = false; expr = Expression.Null; } .) + } + (. if (expr != null) arguments.Add(expr); else canBeRedim = false; .) +. + /* Spec, 11.8 */ Argument (. @@ -2344,14 +2366,14 @@ EmbeddedStatement "Error" Expr (. statement = new ErrorStatement(expr); .) | /* 10.12.1 */ "ReDim" (. bool isPreserve = false; .) [ "Preserve" (. isPreserve = true; .) ] - Expr + ReDimClause (. ReDimStatement reDimStatement = new ReDimStatement(isPreserve); statement = reDimStatement; InvocationExpression redimClause = expr as InvocationExpression; if (redimClause != null) { reDimStatement.ReDimClauses.Add(redimClause); } .) - { "," Expr + { "," ReDimClause (. redimClause = expr as InvocationExpression; .) (. if (redimClause != null) { reDimStatement.ReDimClauses.Add(redimClause); } .) } @@ -2561,27 +2583,28 @@ LabelName . /* 12.12.1 */ -/* -ReDimClause - (. - Expression initializer = null; - Expression arrayInitializer = null; - string name; - .) = - [Expr "." ] - Qualident - (. - clause = new ReDimClause(name); - .) - "(" Expr - (. - clause.Initializers.Add(initializer); - .) - { "," Expr (. clause.Initializers.Add(initializer); .) } +ReDimClause += + SimpleNonInvocationExpression + ReDimClauseInternal +. + +ReDimClauseInternal +(. List arguments; bool canBeNormal; bool canBeRedim; string name; .) += + { "." IdentifierOrKeyword (. expr = new FieldReferenceExpression(expr, name); .) + | IF (la.kind == Tokens.OpenParenthesis && Peek(1).kind == Tokens.Of) + InvocationExpression + } + "(" + NormalOrReDimArgumentList ")" - [ ArrayInitializer ] - . -*/ + (. expr = new InvocationExpression(expr, arguments); + if (canBeRedim == false || canBeNormal && (la.kind == Tokens.Dot || la.kind == Tokens.OpenParenthesis)) { + ReDimClauseInternal(ref expr); + } + .) +. /* 10.10.2.3 */ ResumeStatement diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNetParser.cs b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNetParser.cs index 09e097e6df..43066d80e0 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNetParser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNetParser.cs @@ -238,5 +238,11 @@ namespace ICSharpCode.NRefactory.Parser.VB // TODO return false; } + + void EnsureIsZero(Expression expr) + { + if (!(expr is PrimitiveExpression) || (expr as PrimitiveExpression).StringValue != "0") + Error("lower bound of array must be zero"); + } } } diff --git a/src/Libraries/NRefactory/Test/Parser/Expressions/ArrayCreateExpressionTests.cs b/src/Libraries/NRefactory/Test/Parser/Expressions/ArrayCreateExpressionTests.cs index ed29cdcccd..82b5c11c5e 100644 --- a/src/Libraries/NRefactory/Test/Parser/Expressions/ArrayCreateExpressionTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/Expressions/ArrayCreateExpressionTests.cs @@ -38,6 +38,17 @@ namespace ICSharpCode.NRefactory.Tests.Ast Assert.AreEqual(0, ace.Arguments.Count); Assert.AreEqual(new int[] {0}, ace.CreateType.RankSpecifier); } + + [Test] + public void VBNetArrayCreateExpressionTest2() + { + ArrayCreateExpression ace = ParseUtilVBNet.ParseExpression("New Integer(0 To 5){0, 1, 2, 3, 4, 5}"); + + Assert.AreEqual("Integer", ace.CreateType.Type); + Assert.AreEqual(1, ace.Arguments.Count); + Assert.AreEqual(5, (ace.Arguments[0] as PrimitiveExpression).Value); + Assert.AreEqual(new int[] {0}, ace.CreateType.RankSpecifier); + } #endregion } diff --git a/src/Libraries/NRefactory/Test/Parser/Statements/ReDimStatementTests.cs b/src/Libraries/NRefactory/Test/Parser/Statements/ReDimStatementTests.cs index 7edb2bc2c1..67d88d31dc 100644 --- a/src/Libraries/NRefactory/Test/Parser/Statements/ReDimStatementTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/Statements/ReDimStatementTests.cs @@ -16,11 +16,6 @@ namespace ICSharpCode.NRefactory.Tests.Ast [TestFixture] public class ReDimStatementTests { - #region C# - // No C# representation - #endregion - - #region VB.NET [Test] public void VBNetReDimStatementTest() { @@ -51,10 +46,8 @@ Class X ReDim sTransform(2, iTransformType - 1) ReDim Preserve _Items(_Count) ReDim Preserve _Items(nCapacity) - ReDim Preserve _Items(_Count) - ReDim Preserve _Items(nCapacity) - ReDim Preserve _Items(_Count) - ReDim Preserve _Items(nCapacity) + ReDim Preserve _Items(0 To _Count) + ReDim Preserve _Items(0 To nCapacity) ReDim sU(m - 1, n - 1) ReDim sW(n - 1) ReDim sV(n - 1, n - 1) @@ -65,30 +58,22 @@ Class X If (IsNothing(ColLengths)) Then ReDim ColLengths(0) If (ColLengths.Length = (SubItem + 1)) Then ReDim Preserve ColLengths(SubItem + 1) ReDim sTransform(2, iTransformType - 1) - ReDim Preserve _Items(_Count) - ReDim Preserve _Items(nCapacity) - ReDim Preserve _Items(_Count) - ReDim Preserve _Items(nCapacity) - ReDim Preserve _Items(_Count) - ReDim Preserve _Items(nCapacity) ReDim Preserve Samples(Samples.GetUpperBound(0) + 1) ReDim Samples(0) ReDim BaseCssContent(BaseCssContentRows - 1) ReDim mabtRxBuf(Bytes2Read - 1) - ReDim mabtRxBuf(Bytes2Read - 1) ReDim Preserve primarykey(primarykey.Length) - ReDim Preserve primarykey(primarykey.Length) - ReDim Preserve IntArray(10, 10, 20) ReDim Preserve IntArray(10, 10, 15) ReDim X(10, 10) - ReDim Preserve IntArray(10, 10, 20) + ReDim Preserve IntArray(0 To 10, 10, 0 To 20) ReDim Preserve IntArray(10, 10, 15) - ReDim X(10, 10) + ReDim X(0 To 10, 0 To 10) + ReDim GetMe().IntArray(0 To 10, 10, 0 To 20) + ReDim GetMe(ExplicitParameter := 3).IntArray(0 To 10, 10, 0 To 20) + ReDim SomeType(Of Integer).IntArray(0 To 10, 10, 0 To 20) End Sub End Class"; TypeDeclaration typeDeclaration = ParseUtilVBNet.ParseGlobal(program); } - - #endregion } }