diff --git a/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs b/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs index 177146e134..01ea52bde6 100644 --- a/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs +++ b/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs @@ -86,6 +86,7 @@ namespace NRefactoryASTGenerator.Ast BinaryOperatorType op; Expression right; + public BinaryOperatorExpression() { } public BinaryOperatorExpression(Expression left, BinaryOperatorType op, Expression right) {} } @@ -189,6 +190,7 @@ namespace NRefactoryASTGenerator.Ast Expression trueExpression; Expression falseExpression; + public ConditionalExpression() { } public ConditionalExpression(Expression condition, Expression trueExpression, Expression falseExpression) {} } diff --git a/src/Libraries/NRefactory/Project/Src/Ast/Enums.cs b/src/Libraries/NRefactory/Project/Src/Ast/Enums.cs index 34019f51f3..32dde466b9 100644 --- a/src/Libraries/NRefactory/Project/Src/Ast/Enums.cs +++ b/src/Libraries/NRefactory/Project/Src/Ast/Enums.cs @@ -198,7 +198,10 @@ namespace ICSharpCode.NRefactory.Ast /// VB-only: Like Like, - /// C#: ?? + /// + /// C#: ?? + /// VB: IF(x, y) + /// NullCoalescing, /// VB-only: ! diff --git a/src/Libraries/NRefactory/Project/Src/Ast/Generated.cs b/src/Libraries/NRefactory/Project/Src/Ast/Generated.cs index 97911d3596..cff93173be 100644 --- a/src/Libraries/NRefactory/Project/Src/Ast/Generated.cs +++ b/src/Libraries/NRefactory/Project/Src/Ast/Generated.cs @@ -434,6 +434,11 @@ namespace ICSharpCode.NRefactory.Ast { } } + public BinaryOperatorExpression() { + left = Expression.Null; + right = Expression.Null; + } + public BinaryOperatorExpression(Expression left, BinaryOperatorType op, Expression right) { Left = left; Op = op; @@ -832,6 +837,12 @@ namespace ICSharpCode.NRefactory.Ast { } } + public ConditionalExpression() { + condition = Expression.Null; + trueExpression = Expression.Null; + falseExpression = Expression.Null; + } + public ConditionalExpression(Expression condition, Expression trueExpression, Expression falseExpression) { Condition = condition; TrueExpression = trueExpression; diff --git a/src/Libraries/NRefactory/Project/Src/IAstVisitor.cs b/src/Libraries/NRefactory/Project/Src/IAstVisitor.cs index cbccba4032..00e88a0248 100644 --- a/src/Libraries/NRefactory/Project/Src/IAstVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/IAstVisitor.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:2.0.50727.1434 +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:2.0.50727.3053 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. // //------------------------------------------------------------------------------ diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs index d9a3b26d31..addc73ce59 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs @@ -170,7 +170,7 @@ out u); void GlobalAttributeSection() { Expect(28); -#line 2094 "VBNET.ATG" +#line 2129 "VBNET.ATG" Location startPos = t.Location; if (la.kind == 50) { lexer.NextToken(); @@ -178,20 +178,20 @@ out u); lexer.NextToken(); } else SynErr(211); -#line 2096 "VBNET.ATG" +#line 2131 "VBNET.ATG" string attributeTarget = t.val != null ? t.val.ToLower(System.Globalization.CultureInfo.InvariantCulture) : null; List attributes = new List(); ASTAttribute attribute; Expect(13); Attribute( -#line 2100 "VBNET.ATG" +#line 2135 "VBNET.ATG" out attribute); -#line 2100 "VBNET.ATG" +#line 2135 "VBNET.ATG" attributes.Add(attribute); while ( -#line 2101 "VBNET.ATG" +#line 2136 "VBNET.ATG" NotFinalComma()) { if (la.kind == 12) { lexer.NextToken(); @@ -203,10 +203,10 @@ NotFinalComma()) { Expect(13); } Attribute( -#line 2101 "VBNET.ATG" +#line 2136 "VBNET.ATG" out attribute); -#line 2101 "VBNET.ATG" +#line 2136 "VBNET.ATG" attributes.Add(attribute); } if (la.kind == 12) { @@ -215,7 +215,7 @@ out attribute); Expect(27); EndOfStmt(); -#line 2106 "VBNET.ATG" +#line 2141 "VBNET.ATG" AttributeSection section = new AttributeSection { AttributeTarget = attributeTarget, Attributes = attributes, @@ -324,47 +324,47 @@ out aliasedType); } void Qualident( -#line 2847 "VBNET.ATG" +#line 2882 "VBNET.ATG" out string qualident) { -#line 2849 "VBNET.ATG" +#line 2884 "VBNET.ATG" string name; qualidentBuilder.Length = 0; Identifier(); -#line 2853 "VBNET.ATG" +#line 2888 "VBNET.ATG" qualidentBuilder.Append(t.val); while ( -#line 2854 "VBNET.ATG" +#line 2889 "VBNET.ATG" DotAndIdentOrKw()) { Expect(10); IdentifierOrKeyword( -#line 2854 "VBNET.ATG" +#line 2889 "VBNET.ATG" out name); -#line 2854 "VBNET.ATG" +#line 2889 "VBNET.ATG" qualidentBuilder.Append('.'); qualidentBuilder.Append(name); } -#line 2856 "VBNET.ATG" +#line 2891 "VBNET.ATG" qualident = qualidentBuilder.ToString(); } void TypeName( -#line 1987 "VBNET.ATG" +#line 2022 "VBNET.ATG" out TypeReference typeref) { -#line 1988 "VBNET.ATG" +#line 2023 "VBNET.ATG" ArrayList rank = null; NonArrayTypeName( -#line 1990 "VBNET.ATG" +#line 2025 "VBNET.ATG" out typeref, false); ArrayTypeModifiers( -#line 1991 "VBNET.ATG" +#line 2026 "VBNET.ATG" out rank); -#line 1992 "VBNET.ATG" +#line 2027 "VBNET.ATG" if (rank != null && typeref != null) { typeref.RankSpecifier = (int[])rank.ToArray(typeof(int)); } @@ -387,35 +387,35 @@ out rank); } void AttributeSection( -#line 2171 "VBNET.ATG" +#line 2206 "VBNET.ATG" out AttributeSection section) { -#line 2173 "VBNET.ATG" +#line 2208 "VBNET.ATG" string attributeTarget = "";List attributes = new List(); ASTAttribute attribute; Expect(28); -#line 2177 "VBNET.ATG" +#line 2212 "VBNET.ATG" Location startPos = t.Location; if ( -#line 2178 "VBNET.ATG" +#line 2213 "VBNET.ATG" IsLocalAttrTarget()) { if (la.kind == 94) { lexer.NextToken(); -#line 2179 "VBNET.ATG" +#line 2214 "VBNET.ATG" attributeTarget = "event"; } else if (la.kind == 155) { lexer.NextToken(); -#line 2180 "VBNET.ATG" +#line 2215 "VBNET.ATG" attributeTarget = "return"; } else { Identifier(); -#line 2183 "VBNET.ATG" +#line 2218 "VBNET.ATG" string val = t.val.ToLower(System.Globalization.CultureInfo.InvariantCulture); if (val != "field" || val != "method" || val != "module" || val != "param" || @@ -428,20 +428,20 @@ IsLocalAttrTarget()) { Expect(13); } Attribute( -#line 2193 "VBNET.ATG" +#line 2228 "VBNET.ATG" out attribute); -#line 2193 "VBNET.ATG" +#line 2228 "VBNET.ATG" attributes.Add(attribute); while ( -#line 2194 "VBNET.ATG" +#line 2229 "VBNET.ATG" NotFinalComma()) { Expect(12); Attribute( -#line 2194 "VBNET.ATG" +#line 2229 "VBNET.ATG" out attribute); -#line 2194 "VBNET.ATG" +#line 2229 "VBNET.ATG" attributes.Add(attribute); } if (la.kind == 12) { @@ -449,7 +449,7 @@ out attribute); } Expect(27); -#line 2198 "VBNET.ATG" +#line 2233 "VBNET.ATG" section = new AttributeSection { AttributeTarget = attributeTarget, Attributes = attributes, @@ -460,69 +460,69 @@ out attribute); } void TypeModifier( -#line 2927 "VBNET.ATG" +#line 2962 "VBNET.ATG" ModifierList m) { switch (la.kind) { case 149: { lexer.NextToken(); -#line 2928 "VBNET.ATG" +#line 2963 "VBNET.ATG" m.Add(Modifiers.Public, t.Location); break; } case 148: { lexer.NextToken(); -#line 2929 "VBNET.ATG" +#line 2964 "VBNET.ATG" m.Add(Modifiers.Protected, t.Location); break; } case 100: { lexer.NextToken(); -#line 2930 "VBNET.ATG" +#line 2965 "VBNET.ATG" m.Add(Modifiers.Internal, t.Location); break; } case 146: { lexer.NextToken(); -#line 2931 "VBNET.ATG" +#line 2966 "VBNET.ATG" m.Add(Modifiers.Private, t.Location); break; } case 159: { lexer.NextToken(); -#line 2932 "VBNET.ATG" +#line 2967 "VBNET.ATG" m.Add(Modifiers.Static, t.Location); break; } case 158: { lexer.NextToken(); -#line 2933 "VBNET.ATG" +#line 2968 "VBNET.ATG" m.Add(Modifiers.New, t.Location); break; } case 123: { lexer.NextToken(); -#line 2934 "VBNET.ATG" +#line 2969 "VBNET.ATG" m.Add(Modifiers.Abstract, t.Location); break; } case 132: { lexer.NextToken(); -#line 2935 "VBNET.ATG" +#line 2970 "VBNET.ATG" m.Add(Modifiers.Sealed, t.Location); break; } case 205: { lexer.NextToken(); -#line 2936 "VBNET.ATG" +#line 2971 "VBNET.ATG" m.Add(Modifiers.Partial, t.Location); break; } @@ -1153,10 +1153,10 @@ m, attributes); } void NonArrayTypeName( -#line 2010 "VBNET.ATG" +#line 2045 "VBNET.ATG" out TypeReference typeref, bool canBeUnbound) { -#line 2012 "VBNET.ATG" +#line 2047 "VBNET.ATG" string name; typeref = null; bool isGlobal = false; @@ -1166,38 +1166,38 @@ out TypeReference typeref, bool canBeUnbound) { lexer.NextToken(); Expect(10); -#line 2017 "VBNET.ATG" +#line 2052 "VBNET.ATG" isGlobal = true; } QualIdentAndTypeArguments( -#line 2018 "VBNET.ATG" +#line 2053 "VBNET.ATG" out typeref, canBeUnbound); -#line 2019 "VBNET.ATG" +#line 2054 "VBNET.ATG" typeref.IsGlobal = isGlobal; while (la.kind == 10) { lexer.NextToken(); -#line 2020 "VBNET.ATG" +#line 2055 "VBNET.ATG" TypeReference nestedTypeRef; QualIdentAndTypeArguments( -#line 2021 "VBNET.ATG" +#line 2056 "VBNET.ATG" out nestedTypeRef, canBeUnbound); -#line 2022 "VBNET.ATG" +#line 2057 "VBNET.ATG" typeref = new InnerClassTypeReference(typeref, nestedTypeRef.Type, nestedTypeRef.GenericTypes); } } else if (la.kind == 134) { lexer.NextToken(); -#line 2025 "VBNET.ATG" +#line 2060 "VBNET.ATG" typeref = new TypeReference("System.Object"); } else if (StartOf(10)) { PrimitiveTypeName( -#line 2026 "VBNET.ATG" +#line 2061 "VBNET.ATG" out name); -#line 2026 "VBNET.ATG" +#line 2061 "VBNET.ATG" typeref = new TypeReference(name); } else SynErr(221); } @@ -1280,162 +1280,162 @@ TypeDeclaration newType) { } void FormalParameterList( -#line 2208 "VBNET.ATG" +#line 2243 "VBNET.ATG" List parameter) { -#line 2209 "VBNET.ATG" +#line 2244 "VBNET.ATG" ParameterDeclarationExpression p; FormalParameter( -#line 2211 "VBNET.ATG" +#line 2246 "VBNET.ATG" out p); -#line 2211 "VBNET.ATG" +#line 2246 "VBNET.ATG" if (p != null) parameter.Add(p); while (la.kind == 12) { lexer.NextToken(); FormalParameter( -#line 2213 "VBNET.ATG" +#line 2248 "VBNET.ATG" out p); -#line 2213 "VBNET.ATG" +#line 2248 "VBNET.ATG" if (p != null) parameter.Add(p); } } void MemberModifier( -#line 2939 "VBNET.ATG" +#line 2974 "VBNET.ATG" ModifierList m) { switch (la.kind) { case 123: { lexer.NextToken(); -#line 2940 "VBNET.ATG" +#line 2975 "VBNET.ATG" m.Add(Modifiers.Abstract, t.Location); break; } case 80: { lexer.NextToken(); -#line 2941 "VBNET.ATG" +#line 2976 "VBNET.ATG" m.Add(Modifiers.Default, t.Location); break; } case 100: { lexer.NextToken(); -#line 2942 "VBNET.ATG" +#line 2977 "VBNET.ATG" m.Add(Modifiers.Internal, t.Location); break; } case 158: { lexer.NextToken(); -#line 2943 "VBNET.ATG" +#line 2978 "VBNET.ATG" m.Add(Modifiers.New, t.Location); break; } case 143: { lexer.NextToken(); -#line 2944 "VBNET.ATG" +#line 2979 "VBNET.ATG" m.Add(Modifiers.Override, t.Location); break; } case 124: { lexer.NextToken(); -#line 2945 "VBNET.ATG" +#line 2980 "VBNET.ATG" m.Add(Modifiers.Abstract, t.Location); break; } case 146: { lexer.NextToken(); -#line 2946 "VBNET.ATG" +#line 2981 "VBNET.ATG" m.Add(Modifiers.Private, t.Location); break; } case 148: { lexer.NextToken(); -#line 2947 "VBNET.ATG" +#line 2982 "VBNET.ATG" m.Add(Modifiers.Protected, t.Location); break; } case 149: { lexer.NextToken(); -#line 2948 "VBNET.ATG" +#line 2983 "VBNET.ATG" m.Add(Modifiers.Public, t.Location); break; } case 132: { lexer.NextToken(); -#line 2949 "VBNET.ATG" +#line 2984 "VBNET.ATG" m.Add(Modifiers.Sealed, t.Location); break; } case 133: { lexer.NextToken(); -#line 2950 "VBNET.ATG" +#line 2985 "VBNET.ATG" m.Add(Modifiers.Sealed, t.Location); break; } case 159: { lexer.NextToken(); -#line 2951 "VBNET.ATG" +#line 2986 "VBNET.ATG" m.Add(Modifiers.Static, t.Location); break; } case 142: { lexer.NextToken(); -#line 2952 "VBNET.ATG" +#line 2987 "VBNET.ATG" m.Add(Modifiers.Virtual, t.Location); break; } case 141: { lexer.NextToken(); -#line 2953 "VBNET.ATG" +#line 2988 "VBNET.ATG" m.Add(Modifiers.Overloads, t.Location); break; } case 151: { lexer.NextToken(); -#line 2954 "VBNET.ATG" +#line 2989 "VBNET.ATG" m.Add(Modifiers.ReadOnly, t.Location); break; } case 185: { lexer.NextToken(); -#line 2955 "VBNET.ATG" +#line 2990 "VBNET.ATG" m.Add(Modifiers.WriteOnly, t.Location); break; } case 184: { lexer.NextToken(); -#line 2956 "VBNET.ATG" +#line 2991 "VBNET.ATG" m.Add(Modifiers.WithEvents, t.Location); break; } case 82: { lexer.NextToken(); -#line 2957 "VBNET.ATG" +#line 2992 "VBNET.ATG" m.Add(Modifiers.Dim, t.Location); break; } case 205: { lexer.NextToken(); -#line 2958 "VBNET.ATG" +#line 2993 "VBNET.ATG" m.Add(Modifiers.Partial, t.Location); break; } @@ -2534,25 +2534,25 @@ out name); } void Block( -#line 2255 "VBNET.ATG" +#line 2290 "VBNET.ATG" out Statement stmt) { -#line 2258 "VBNET.ATG" +#line 2293 "VBNET.ATG" BlockStatement blockStmt = new BlockStatement(); /* in snippet parsing mode, t might be null */ if (t != null) blockStmt.StartLocation = t.Location; compilationUnit.BlockStart(blockStmt); while (StartOf(20) || -#line 2264 "VBNET.ATG" +#line 2299 "VBNET.ATG" IsEndStmtAhead()) { if ( -#line 2264 "VBNET.ATG" +#line 2299 "VBNET.ATG" IsEndStmtAhead()) { Expect(89); EndOfStmt(); -#line 2264 "VBNET.ATG" +#line 2299 "VBNET.ATG" compilationUnit.AddChild(new EndStatement()); } else { Statement(); @@ -2560,7 +2560,7 @@ IsEndStmtAhead()) { } } -#line 2269 "VBNET.ATG" +#line 2304 "VBNET.ATG" stmt = blockStmt; if (t != null) blockStmt.EndLocation = t.EndLocation; compilationUnit.BlockEnd(); @@ -3195,31 +3195,31 @@ out stmt); } void PropertyAccessorAccessModifier( -#line 2961 "VBNET.ATG" +#line 2996 "VBNET.ATG" out Modifiers m) { -#line 2962 "VBNET.ATG" +#line 2997 "VBNET.ATG" m = Modifiers.None; while (StartOf(26)) { if (la.kind == 149) { lexer.NextToken(); -#line 2964 "VBNET.ATG" +#line 2999 "VBNET.ATG" m |= Modifiers.Public; } else if (la.kind == 148) { lexer.NextToken(); -#line 2965 "VBNET.ATG" +#line 3000 "VBNET.ATG" m |= Modifiers.Protected; } else if (la.kind == 100) { lexer.NextToken(); -#line 2966 "VBNET.ATG" +#line 3001 "VBNET.ATG" m |= Modifiers.Internal; } else { lexer.NextToken(); -#line 2967 "VBNET.ATG" +#line 3002 "VBNET.ATG" m |= Modifiers.Private; } } @@ -3240,22 +3240,22 @@ out arrayModifiers); } void ArrayNameModifier( -#line 2046 "VBNET.ATG" +#line 2081 "VBNET.ATG" out ArrayList arrayModifiers) { -#line 2048 "VBNET.ATG" +#line 2083 "VBNET.ATG" arrayModifiers = null; ArrayTypeModifiers( -#line 2050 "VBNET.ATG" +#line 2085 "VBNET.ATG" out arrayModifiers); } void ObjectCreateExpression( -#line 1897 "VBNET.ATG" +#line 1932 "VBNET.ATG" out Expression oce) { -#line 1899 "VBNET.ATG" +#line 1934 "VBNET.ATG" TypeReference type = null; Expression initializer = null; List arguments = null; @@ -3265,38 +3265,38 @@ out Expression oce) { Expect(128); NonArrayTypeName( -#line 1906 "VBNET.ATG" +#line 1941 "VBNET.ATG" out type, false); if (la.kind == 25) { lexer.NextToken(); NormalOrReDimArgumentList( -#line 1907 "VBNET.ATG" +#line 1942 "VBNET.ATG" out arguments, out canBeNormal, out canBeReDim); Expect(26); if (la.kind == 23 || -#line 1908 "VBNET.ATG" +#line 1943 "VBNET.ATG" la.kind == Tokens.OpenParenthesis) { if ( -#line 1908 "VBNET.ATG" +#line 1943 "VBNET.ATG" la.kind == Tokens.OpenParenthesis) { ArrayTypeModifiers( -#line 1909 "VBNET.ATG" +#line 1944 "VBNET.ATG" out dimensions); CollectionInitializer( -#line 1910 "VBNET.ATG" +#line 1945 "VBNET.ATG" out initializer); } else { CollectionInitializer( -#line 1911 "VBNET.ATG" +#line 1946 "VBNET.ATG" out initializer); } } -#line 1913 "VBNET.ATG" +#line 1948 "VBNET.ATG" if (canBeReDim && !canBeNormal && initializer == null) initializer = new CollectionInitializerExpression(); } -#line 1916 "VBNET.ATG" +#line 1951 "VBNET.ATG" if (type == null) type = new TypeReference("Object"); // fallback type on parser errors if (initializer == null) { oce = new ObjectCreateExpression(type, arguments); @@ -3435,46 +3435,46 @@ out eventName); } void IdentifierOrKeyword( -#line 2894 "VBNET.ATG" +#line 2929 "VBNET.ATG" out string name) { -#line 2896 "VBNET.ATG" +#line 2931 "VBNET.ATG" lexer.NextToken(); name = t.val; } void DisjunctionExpr( -#line 1741 "VBNET.ATG" +#line 1776 "VBNET.ATG" out Expression outExpr) { -#line 1743 "VBNET.ATG" +#line 1778 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ConjunctionExpr( -#line 1746 "VBNET.ATG" +#line 1781 "VBNET.ATG" out outExpr); while (la.kind == 139 || la.kind == 140 || la.kind == 186) { if (la.kind == 139) { lexer.NextToken(); -#line 1749 "VBNET.ATG" +#line 1784 "VBNET.ATG" op = BinaryOperatorType.BitwiseOr; } else if (la.kind == 140) { lexer.NextToken(); -#line 1750 "VBNET.ATG" +#line 1785 "VBNET.ATG" op = BinaryOperatorType.LogicalOr; } else { lexer.NextToken(); -#line 1751 "VBNET.ATG" +#line 1786 "VBNET.ATG" op = BinaryOperatorType.ExclusiveOr; } ConjunctionExpr( -#line 1753 "VBNET.ATG" +#line 1788 "VBNET.ATG" out expr); -#line 1753 "VBNET.ATG" +#line 1788 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } @@ -3604,79 +3604,60 @@ out Expression pexpr) { string name = String.Empty; pexpr = null; - if (StartOf(29)) { - switch (la.kind) { - case 3: { + if (StartOf(29) || +#line 1676 "VBNET.ATG" +la.kind == Tokens.If) { + if (la.kind == 3) { lexer.NextToken(); #line 1634 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val) { LiteralFormat = t.literalFormat }; - break; - } - case 4: { + } else if (la.kind == 4) { lexer.NextToken(); #line 1635 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val) { LiteralFormat = t.literalFormat }; - break; - } - case 7: { + } else if (la.kind == 7) { lexer.NextToken(); #line 1636 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val) { LiteralFormat = t.literalFormat }; - break; - } - case 6: { + } else if (la.kind == 6) { lexer.NextToken(); #line 1637 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val) { LiteralFormat = t.literalFormat }; - break; - } - case 5: { + } else if (la.kind == 5) { lexer.NextToken(); #line 1638 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val) { LiteralFormat = t.literalFormat }; - break; - } - case 9: { + } else if (la.kind == 9) { lexer.NextToken(); #line 1639 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val) { LiteralFormat = t.literalFormat }; - break; - } - case 8: { + } else if (la.kind == 8) { lexer.NextToken(); #line 1640 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val) { LiteralFormat = t.literalFormat }; - break; - } - case 174: { + } else if (la.kind == 174) { lexer.NextToken(); #line 1642 "VBNET.ATG" pexpr = new PrimitiveExpression(true, "true"); - break; - } - case 97: { + } else if (la.kind == 97) { lexer.NextToken(); #line 1643 "VBNET.ATG" pexpr = new PrimitiveExpression(false, "false"); - break; - } - case 131: { + } else if (la.kind == 131) { lexer.NextToken(); #line 1644 "VBNET.ATG" pexpr = new PrimitiveExpression(null, "null"); - break; - } - case 25: { + } else if (la.kind == 25) { lexer.NextToken(); Expr( #line 1645 "VBNET.ATG" @@ -3685,9 +3666,7 @@ out expr); #line 1645 "VBNET.ATG" pexpr = new ParenthesizedExpression(expr); - break; - } - case 2: case 48: case 50: case 51: case 52: case 71: case 96: case 135: case 145: case 170: case 177: case 178: case 206: { + } else if (StartOf(13)) { Identifier(); #line 1647 "VBNET.ATG" @@ -3695,9 +3674,7 @@ out expr); #line 1648 "VBNET.ATG" pexpr.StartLocation = t.Location; pexpr.EndLocation = t.EndLocation; - break; - } - case 53: case 55: case 66: case 77: case 78: case 85: case 112: case 118: case 134: case 160: case 161: case 166: case 192: case 193: case 194: case 195: { + } else if (StartOf(30)) { #line 1649 "VBNET.ATG" string val = String.Empty; @@ -3719,16 +3696,12 @@ out val); #line 1651 "VBNET.ATG" pexpr = new MemberReferenceExpression(new TypeReferenceExpression(val), t.val); - break; - } - case 120: { + } else if (la.kind == 120) { lexer.NextToken(); #line 1652 "VBNET.ATG" pexpr = new ThisReferenceExpression(); - break; - } - case 125: case 126: { + } else if (la.kind == 125 || la.kind == 126) { #line 1653 "VBNET.ATG" Expression retExpr = null; @@ -3750,9 +3723,7 @@ out name); #line 1657 "VBNET.ATG" pexpr = new MemberReferenceExpression(retExpr, name); - break; - } - case 200: { + } else if (la.kind == 200) { lexer.NextToken(); Expect(10); Identifier(); @@ -3765,18 +3736,14 @@ out name); #line 1662 "VBNET.ATG" pexpr = new TypeReferenceExpression(type); - break; - } - case 128: { + } else if (la.kind == 128) { ObjectCreateExpression( #line 1663 "VBNET.ATG" out expr); #line 1663 "VBNET.ATG" pexpr = expr; - break; - } - case 76: case 83: case 201: { + } else if (la.kind == 76 || la.kind == 83 || la.kind == 201) { #line 1665 "VBNET.ATG" CastType castType = CastType.Cast; @@ -3805,9 +3772,7 @@ out type); #line 1671 "VBNET.ATG" pexpr = new CastExpression(type, expr, castType); - break; - } - case 60: case 61: case 62: case 63: case 64: case 65: case 67: case 69: case 70: case 73: case 74: case 75: case 196: case 197: case 198: case 199: { + } else if (StartOf(31)) { CastTarget( #line 1672 "VBNET.ATG" out type); @@ -3819,9 +3784,7 @@ out expr); #line 1672 "VBNET.ATG" pexpr = new CastExpression(type, expr, CastType.PrimitiveConversion); - break; - } - case 44: { + } else if (la.kind == 44) { lexer.NextToken(); Expr( #line 1673 "VBNET.ATG" @@ -3829,9 +3792,7 @@ out expr); #line 1673 "VBNET.ATG" pexpr = new AddressOfExpression(expr); - break; - } - case 103: { + } else if (la.kind == 103) { lexer.NextToken(); Expect(25); GetTypeTypeName( @@ -3841,9 +3802,7 @@ out type); #line 1674 "VBNET.ATG" pexpr = new TypeOfExpression(type); - break; - } - case 176: { + } else if (la.kind == 176) { lexer.NextToken(); SimpleExpr( #line 1675 "VBNET.ATG" @@ -3855,47 +3814,49 @@ out type); #line 1675 "VBNET.ATG" pexpr = new TypeOfIsExpression(expr, type); - break; - } + } else { + ConditionalExpression( +#line 1676 "VBNET.ATG" +out pexpr); } } else if (la.kind == 10) { lexer.NextToken(); IdentifierOrKeyword( -#line 1679 "VBNET.ATG" +#line 1680 "VBNET.ATG" out name); -#line 1679 "VBNET.ATG" +#line 1680 "VBNET.ATG" pexpr = new MemberReferenceExpression(null, name); } else SynErr(244); } void InvocationExpression( -#line 1683 "VBNET.ATG" +#line 1718 "VBNET.ATG" ref Expression pexpr) { -#line 1684 "VBNET.ATG" +#line 1719 "VBNET.ATG" List typeParameters = new List(); List parameters = null; TypeReference type; Expect(25); -#line 1688 "VBNET.ATG" +#line 1723 "VBNET.ATG" Location start = t.Location; if (la.kind == 202) { lexer.NextToken(); TypeName( -#line 1690 "VBNET.ATG" +#line 1725 "VBNET.ATG" out type); -#line 1690 "VBNET.ATG" +#line 1725 "VBNET.ATG" if (type != null) typeParameters.Add(type); while (la.kind == 12) { lexer.NextToken(); TypeName( -#line 1693 "VBNET.ATG" +#line 1728 "VBNET.ATG" out type); -#line 1693 "VBNET.ATG" +#line 1728 "VBNET.ATG" if (type != null) typeParameters.Add(type); } Expect(26); @@ -3903,145 +3864,145 @@ out type); lexer.NextToken(); Identifier(); -#line 1698 "VBNET.ATG" +#line 1733 "VBNET.ATG" pexpr = new MemberReferenceExpression(GetTypeReferenceExpression(pexpr, typeParameters), t.val); } else if (la.kind == 25) { lexer.NextToken(); ArgumentList( -#line 1700 "VBNET.ATG" +#line 1735 "VBNET.ATG" out parameters); Expect(26); -#line 1703 "VBNET.ATG" +#line 1738 "VBNET.ATG" pexpr = CreateInvocationExpression(pexpr, parameters, typeParameters); SetParent(parameters, pexpr); } else SynErr(245); - } else if (StartOf(30)) { + } else if (StartOf(32)) { ArgumentList( -#line 1707 "VBNET.ATG" +#line 1742 "VBNET.ATG" out parameters); Expect(26); -#line 1710 "VBNET.ATG" +#line 1745 "VBNET.ATG" pexpr = CreateInvocationExpression(pexpr, parameters, typeParameters); SetParent(parameters, pexpr); } else SynErr(246); -#line 1714 "VBNET.ATG" +#line 1749 "VBNET.ATG" pexpr.StartLocation = start; pexpr.EndLocation = t.Location; } void PrimitiveTypeName( -#line 2901 "VBNET.ATG" +#line 2936 "VBNET.ATG" out string type) { -#line 2902 "VBNET.ATG" +#line 2937 "VBNET.ATG" type = String.Empty; switch (la.kind) { case 53: { lexer.NextToken(); -#line 2903 "VBNET.ATG" +#line 2938 "VBNET.ATG" type = "Boolean"; break; } case 77: { lexer.NextToken(); -#line 2904 "VBNET.ATG" +#line 2939 "VBNET.ATG" type = "Date"; break; } case 66: { lexer.NextToken(); -#line 2905 "VBNET.ATG" +#line 2940 "VBNET.ATG" type = "Char"; break; } case 166: { lexer.NextToken(); -#line 2906 "VBNET.ATG" +#line 2941 "VBNET.ATG" type = "String"; break; } case 78: { lexer.NextToken(); -#line 2907 "VBNET.ATG" +#line 2942 "VBNET.ATG" type = "Decimal"; break; } case 55: { lexer.NextToken(); -#line 2908 "VBNET.ATG" +#line 2943 "VBNET.ATG" type = "Byte"; break; } case 160: { lexer.NextToken(); -#line 2909 "VBNET.ATG" +#line 2944 "VBNET.ATG" type = "Short"; break; } case 112: { lexer.NextToken(); -#line 2910 "VBNET.ATG" +#line 2945 "VBNET.ATG" type = "Integer"; break; } case 118: { lexer.NextToken(); -#line 2911 "VBNET.ATG" +#line 2946 "VBNET.ATG" type = "Long"; break; } case 161: { lexer.NextToken(); -#line 2912 "VBNET.ATG" +#line 2947 "VBNET.ATG" type = "Single"; break; } case 85: { lexer.NextToken(); -#line 2913 "VBNET.ATG" +#line 2948 "VBNET.ATG" type = "Double"; break; } case 193: { lexer.NextToken(); -#line 2914 "VBNET.ATG" +#line 2949 "VBNET.ATG" type = "UInteger"; break; } case 194: { lexer.NextToken(); -#line 2915 "VBNET.ATG" +#line 2950 "VBNET.ATG" type = "ULong"; break; } case 195: { lexer.NextToken(); -#line 2916 "VBNET.ATG" +#line 2951 "VBNET.ATG" type = "UShort"; break; } case 192: { lexer.NextToken(); -#line 2917 "VBNET.ATG" +#line 2952 "VBNET.ATG" type = "SByte"; break; } @@ -4050,122 +4011,122 @@ out string type) { } void CastTarget( -#line 1719 "VBNET.ATG" +#line 1754 "VBNET.ATG" out TypeReference type) { -#line 1721 "VBNET.ATG" +#line 1756 "VBNET.ATG" type = null; switch (la.kind) { case 60: { lexer.NextToken(); -#line 1723 "VBNET.ATG" +#line 1758 "VBNET.ATG" type = new TypeReference("System.Boolean"); break; } case 61: { lexer.NextToken(); -#line 1724 "VBNET.ATG" +#line 1759 "VBNET.ATG" type = new TypeReference("System.Byte"); break; } case 196: { lexer.NextToken(); -#line 1725 "VBNET.ATG" +#line 1760 "VBNET.ATG" type = new TypeReference("System.SByte"); break; } case 62: { lexer.NextToken(); -#line 1726 "VBNET.ATG" +#line 1761 "VBNET.ATG" type = new TypeReference("System.Char"); break; } case 63: { lexer.NextToken(); -#line 1727 "VBNET.ATG" +#line 1762 "VBNET.ATG" type = new TypeReference("System.DateTime"); break; } case 65: { lexer.NextToken(); -#line 1728 "VBNET.ATG" +#line 1763 "VBNET.ATG" type = new TypeReference("System.Decimal"); break; } case 64: { lexer.NextToken(); -#line 1729 "VBNET.ATG" +#line 1764 "VBNET.ATG" type = new TypeReference("System.Double"); break; } case 73: { lexer.NextToken(); -#line 1730 "VBNET.ATG" +#line 1765 "VBNET.ATG" type = new TypeReference("System.Int16"); break; } case 67: { lexer.NextToken(); -#line 1731 "VBNET.ATG" +#line 1766 "VBNET.ATG" type = new TypeReference("System.Int32"); break; } case 69: { lexer.NextToken(); -#line 1732 "VBNET.ATG" +#line 1767 "VBNET.ATG" type = new TypeReference("System.Int64"); break; } case 197: { lexer.NextToken(); -#line 1733 "VBNET.ATG" +#line 1768 "VBNET.ATG" type = new TypeReference("System.UInt16"); break; } case 198: { lexer.NextToken(); -#line 1734 "VBNET.ATG" +#line 1769 "VBNET.ATG" type = new TypeReference("System.UInt32"); break; } case 199: { lexer.NextToken(); -#line 1735 "VBNET.ATG" +#line 1770 "VBNET.ATG" type = new TypeReference("System.UInt64"); break; } case 70: { lexer.NextToken(); -#line 1736 "VBNET.ATG" +#line 1771 "VBNET.ATG" type = new TypeReference("System.Object"); break; } case 74: { lexer.NextToken(); -#line 1737 "VBNET.ATG" +#line 1772 "VBNET.ATG" type = new TypeReference("System.Single"); break; } case 75: { lexer.NextToken(); -#line 1738 "VBNET.ATG" +#line 1773 "VBNET.ATG" type = new TypeReference("System.String"); break; } @@ -4174,368 +4135,420 @@ out TypeReference type) { } void GetTypeTypeName( -#line 1998 "VBNET.ATG" +#line 2033 "VBNET.ATG" out TypeReference typeref) { -#line 1999 "VBNET.ATG" +#line 2034 "VBNET.ATG" ArrayList rank = null; NonArrayTypeName( -#line 2001 "VBNET.ATG" +#line 2036 "VBNET.ATG" out typeref, true); ArrayTypeModifiers( -#line 2002 "VBNET.ATG" +#line 2037 "VBNET.ATG" out rank); -#line 2003 "VBNET.ATG" +#line 2038 "VBNET.ATG" if (rank != null && typeref != null) { typeref.RankSpecifier = (int[])rank.ToArray(typeof(int)); } } + void ConditionalExpression( +#line 1684 "VBNET.ATG" +out Expression expr) { + +#line 1686 "VBNET.ATG" + ConditionalExpression conditionalExpression = new ConditionalExpression(); + BinaryOperatorExpression binaryOperatorExpression = new BinaryOperatorExpression(); + conditionalExpression.StartLocation = binaryOperatorExpression.StartLocation = la.Location; + + Expression condition = null; + Expression trueExpr = null; + Expression falseExpr = null; + + Expect(107); + Expect(25); + Expr( +#line 1695 "VBNET.ATG" +out condition); + Expect(12); + Expr( +#line 1695 "VBNET.ATG" +out trueExpr); + if (la.kind == 12) { + lexer.NextToken(); + Expr( +#line 1695 "VBNET.ATG" +out falseExpr); + } + Expect(26); + +#line 1697 "VBNET.ATG" + if(falseExpr != null) + { + conditionalExpression.Condition = condition; + conditionalExpression.TrueExpression = trueExpr; + conditionalExpression.FalseExpression = falseExpr; + conditionalExpression.EndLocation = t.EndLocation; + + expr = conditionalExpression; + } + else + { + binaryOperatorExpression.Left = condition; + binaryOperatorExpression.Right = trueExpr; + binaryOperatorExpression.Op = BinaryOperatorType.NullCoalescing; + binaryOperatorExpression.EndLocation = t.EndLocation; + + expr = binaryOperatorExpression; + } + + } + void ArgumentList( -#line 1933 "VBNET.ATG" +#line 1968 "VBNET.ATG" out List arguments) { -#line 1935 "VBNET.ATG" +#line 1970 "VBNET.ATG" arguments = new List(); Expression expr = null; if (StartOf(27)) { Argument( -#line 1938 "VBNET.ATG" +#line 1973 "VBNET.ATG" out expr); } while (la.kind == 12) { lexer.NextToken(); -#line 1939 "VBNET.ATG" +#line 1974 "VBNET.ATG" arguments.Add(expr ?? Expression.Null); expr = null; if (StartOf(27)) { Argument( -#line 1940 "VBNET.ATG" +#line 1975 "VBNET.ATG" out expr); } -#line 1941 "VBNET.ATG" +#line 1976 "VBNET.ATG" if (expr == null) expr = Expression.Null; } -#line 1943 "VBNET.ATG" +#line 1978 "VBNET.ATG" if (expr != null) arguments.Add(expr); } void ConjunctionExpr( -#line 1757 "VBNET.ATG" +#line 1792 "VBNET.ATG" out Expression outExpr) { -#line 1759 "VBNET.ATG" +#line 1794 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; NotExpr( -#line 1762 "VBNET.ATG" +#line 1797 "VBNET.ATG" out outExpr); while (la.kind == 46 || la.kind == 47) { if (la.kind == 46) { lexer.NextToken(); -#line 1765 "VBNET.ATG" +#line 1800 "VBNET.ATG" op = BinaryOperatorType.BitwiseAnd; } else { lexer.NextToken(); -#line 1766 "VBNET.ATG" +#line 1801 "VBNET.ATG" op = BinaryOperatorType.LogicalAnd; } NotExpr( -#line 1768 "VBNET.ATG" +#line 1803 "VBNET.ATG" out expr); -#line 1768 "VBNET.ATG" +#line 1803 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void NotExpr( -#line 1772 "VBNET.ATG" +#line 1807 "VBNET.ATG" out Expression outExpr) { -#line 1773 "VBNET.ATG" +#line 1808 "VBNET.ATG" UnaryOperatorType uop = UnaryOperatorType.None; while (la.kind == 130) { lexer.NextToken(); -#line 1774 "VBNET.ATG" +#line 1809 "VBNET.ATG" uop = UnaryOperatorType.Not; } ComparisonExpr( -#line 1775 "VBNET.ATG" +#line 1810 "VBNET.ATG" out outExpr); -#line 1776 "VBNET.ATG" +#line 1811 "VBNET.ATG" if (uop != UnaryOperatorType.None) outExpr = new UnaryOperatorExpression(outExpr, uop); } void ComparisonExpr( -#line 1781 "VBNET.ATG" +#line 1816 "VBNET.ATG" out Expression outExpr) { -#line 1783 "VBNET.ATG" +#line 1818 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ShiftExpr( -#line 1786 "VBNET.ATG" +#line 1821 "VBNET.ATG" out outExpr); - while (StartOf(31)) { + while (StartOf(33)) { switch (la.kind) { case 28: { lexer.NextToken(); -#line 1789 "VBNET.ATG" +#line 1824 "VBNET.ATG" op = BinaryOperatorType.LessThan; break; } case 27: { lexer.NextToken(); -#line 1790 "VBNET.ATG" +#line 1825 "VBNET.ATG" op = BinaryOperatorType.GreaterThan; break; } case 31: { lexer.NextToken(); -#line 1791 "VBNET.ATG" +#line 1826 "VBNET.ATG" op = BinaryOperatorType.LessThanOrEqual; break; } case 30: { lexer.NextToken(); -#line 1792 "VBNET.ATG" +#line 1827 "VBNET.ATG" op = BinaryOperatorType.GreaterThanOrEqual; break; } case 29: { lexer.NextToken(); -#line 1793 "VBNET.ATG" +#line 1828 "VBNET.ATG" op = BinaryOperatorType.InEquality; break; } case 11: { lexer.NextToken(); -#line 1794 "VBNET.ATG" +#line 1829 "VBNET.ATG" op = BinaryOperatorType.Equality; break; } case 117: { lexer.NextToken(); -#line 1795 "VBNET.ATG" +#line 1830 "VBNET.ATG" op = BinaryOperatorType.Like; break; } case 114: { lexer.NextToken(); -#line 1796 "VBNET.ATG" +#line 1831 "VBNET.ATG" op = BinaryOperatorType.ReferenceEquality; break; } case 191: { lexer.NextToken(); -#line 1797 "VBNET.ATG" +#line 1832 "VBNET.ATG" op = BinaryOperatorType.ReferenceInequality; break; } } - if (StartOf(32)) { + if (StartOf(34)) { ShiftExpr( -#line 1800 "VBNET.ATG" +#line 1835 "VBNET.ATG" out expr); -#line 1800 "VBNET.ATG" +#line 1835 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } else if (la.kind == 130) { lexer.NextToken(); ShiftExpr( -#line 1803 "VBNET.ATG" +#line 1838 "VBNET.ATG" out expr); -#line 1803 "VBNET.ATG" +#line 1838 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, new UnaryOperatorExpression(expr, UnaryOperatorType.Not)); } else SynErr(249); } } void ShiftExpr( -#line 1808 "VBNET.ATG" +#line 1843 "VBNET.ATG" out Expression outExpr) { -#line 1810 "VBNET.ATG" +#line 1845 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ConcatenationExpr( -#line 1813 "VBNET.ATG" +#line 1848 "VBNET.ATG" out outExpr); while (la.kind == 32 || la.kind == 33) { if (la.kind == 32) { lexer.NextToken(); -#line 1816 "VBNET.ATG" +#line 1851 "VBNET.ATG" op = BinaryOperatorType.ShiftLeft; } else { lexer.NextToken(); -#line 1817 "VBNET.ATG" +#line 1852 "VBNET.ATG" op = BinaryOperatorType.ShiftRight; } ConcatenationExpr( -#line 1819 "VBNET.ATG" +#line 1854 "VBNET.ATG" out expr); -#line 1819 "VBNET.ATG" +#line 1854 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void ConcatenationExpr( -#line 1823 "VBNET.ATG" +#line 1858 "VBNET.ATG" out Expression outExpr) { -#line 1824 "VBNET.ATG" +#line 1859 "VBNET.ATG" Expression expr; AdditiveExpr( -#line 1826 "VBNET.ATG" +#line 1861 "VBNET.ATG" out outExpr); while (la.kind == 19) { lexer.NextToken(); AdditiveExpr( -#line 1826 "VBNET.ATG" +#line 1861 "VBNET.ATG" out expr); -#line 1826 "VBNET.ATG" +#line 1861 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.Concat, expr); } } void AdditiveExpr( -#line 1829 "VBNET.ATG" +#line 1864 "VBNET.ATG" out Expression outExpr) { -#line 1831 "VBNET.ATG" +#line 1866 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ModuloExpr( -#line 1834 "VBNET.ATG" +#line 1869 "VBNET.ATG" out outExpr); while (la.kind == 14 || la.kind == 15) { if (la.kind == 14) { lexer.NextToken(); -#line 1837 "VBNET.ATG" +#line 1872 "VBNET.ATG" op = BinaryOperatorType.Add; } else { lexer.NextToken(); -#line 1838 "VBNET.ATG" +#line 1873 "VBNET.ATG" op = BinaryOperatorType.Subtract; } ModuloExpr( -#line 1840 "VBNET.ATG" +#line 1875 "VBNET.ATG" out expr); -#line 1840 "VBNET.ATG" +#line 1875 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void ModuloExpr( -#line 1844 "VBNET.ATG" +#line 1879 "VBNET.ATG" out Expression outExpr) { -#line 1845 "VBNET.ATG" +#line 1880 "VBNET.ATG" Expression expr; IntegerDivisionExpr( -#line 1847 "VBNET.ATG" +#line 1882 "VBNET.ATG" out outExpr); while (la.kind == 121) { lexer.NextToken(); IntegerDivisionExpr( -#line 1847 "VBNET.ATG" +#line 1882 "VBNET.ATG" out expr); -#line 1847 "VBNET.ATG" +#line 1882 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.Modulus, expr); } } void IntegerDivisionExpr( -#line 1850 "VBNET.ATG" +#line 1885 "VBNET.ATG" out Expression outExpr) { -#line 1851 "VBNET.ATG" +#line 1886 "VBNET.ATG" Expression expr; MultiplicativeExpr( -#line 1853 "VBNET.ATG" +#line 1888 "VBNET.ATG" out outExpr); while (la.kind == 18) { lexer.NextToken(); MultiplicativeExpr( -#line 1853 "VBNET.ATG" +#line 1888 "VBNET.ATG" out expr); -#line 1853 "VBNET.ATG" +#line 1888 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.DivideInteger, expr); } } void MultiplicativeExpr( -#line 1856 "VBNET.ATG" +#line 1891 "VBNET.ATG" out Expression outExpr) { -#line 1858 "VBNET.ATG" +#line 1893 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; UnaryExpr( -#line 1861 "VBNET.ATG" +#line 1896 "VBNET.ATG" out outExpr); while (la.kind == 16 || la.kind == 17) { if (la.kind == 16) { lexer.NextToken(); -#line 1864 "VBNET.ATG" +#line 1899 "VBNET.ATG" op = BinaryOperatorType.Multiply; } else { lexer.NextToken(); -#line 1865 "VBNET.ATG" +#line 1900 "VBNET.ATG" op = BinaryOperatorType.Divide; } UnaryExpr( -#line 1867 "VBNET.ATG" +#line 1902 "VBNET.ATG" out expr); -#line 1867 "VBNET.ATG" +#line 1902 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void UnaryExpr( -#line 1871 "VBNET.ATG" +#line 1906 "VBNET.ATG" out Expression uExpr) { -#line 1873 "VBNET.ATG" +#line 1908 "VBNET.ATG" Expression expr; UnaryOperatorType uop = UnaryOperatorType.None; bool isUOp = false; @@ -4544,25 +4557,25 @@ out Expression uExpr) { if (la.kind == 14) { lexer.NextToken(); -#line 1877 "VBNET.ATG" +#line 1912 "VBNET.ATG" uop = UnaryOperatorType.Plus; isUOp = true; } else if (la.kind == 15) { lexer.NextToken(); -#line 1878 "VBNET.ATG" +#line 1913 "VBNET.ATG" uop = UnaryOperatorType.Minus; isUOp = true; } else { lexer.NextToken(); -#line 1879 "VBNET.ATG" +#line 1914 "VBNET.ATG" uop = UnaryOperatorType.Dereference; isUOp = true; } } ExponentiationExpr( -#line 1881 "VBNET.ATG" +#line 1916 "VBNET.ATG" out expr); -#line 1883 "VBNET.ATG" +#line 1918 "VBNET.ATG" if (isUOp) { uExpr = new UnaryOperatorExpression(expr, uop); } else { @@ -4572,107 +4585,107 @@ out expr); } void ExponentiationExpr( -#line 1891 "VBNET.ATG" +#line 1926 "VBNET.ATG" out Expression outExpr) { -#line 1892 "VBNET.ATG" +#line 1927 "VBNET.ATG" Expression expr; SimpleExpr( -#line 1894 "VBNET.ATG" +#line 1929 "VBNET.ATG" out outExpr); while (la.kind == 20) { lexer.NextToken(); SimpleExpr( -#line 1894 "VBNET.ATG" +#line 1929 "VBNET.ATG" out expr); -#line 1894 "VBNET.ATG" +#line 1929 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.Power, expr); } } void NormalOrReDimArgumentList( -#line 1947 "VBNET.ATG" +#line 1982 "VBNET.ATG" out List arguments, out bool canBeNormal, out bool canBeRedim) { -#line 1949 "VBNET.ATG" +#line 1984 "VBNET.ATG" arguments = new List(); canBeNormal = true; canBeRedim = !IsNamedAssign(); Expression expr = null; if (StartOf(27)) { Argument( -#line 1954 "VBNET.ATG" +#line 1989 "VBNET.ATG" out expr); if (la.kind == 173) { lexer.NextToken(); -#line 1955 "VBNET.ATG" +#line 1990 "VBNET.ATG" EnsureIsZero(expr); canBeNormal = false; Expr( -#line 1956 "VBNET.ATG" +#line 1991 "VBNET.ATG" out expr); } } while (la.kind == 12) { lexer.NextToken(); -#line 1959 "VBNET.ATG" +#line 1994 "VBNET.ATG" if (expr == null) canBeRedim = false; -#line 1960 "VBNET.ATG" +#line 1995 "VBNET.ATG" arguments.Add(expr ?? Expression.Null); expr = null; -#line 1961 "VBNET.ATG" +#line 1996 "VBNET.ATG" canBeRedim &= !IsNamedAssign(); if (StartOf(27)) { Argument( -#line 1962 "VBNET.ATG" +#line 1997 "VBNET.ATG" out expr); if (la.kind == 173) { lexer.NextToken(); -#line 1963 "VBNET.ATG" +#line 1998 "VBNET.ATG" EnsureIsZero(expr); canBeNormal = false; Expr( -#line 1964 "VBNET.ATG" +#line 1999 "VBNET.ATG" out expr); } } -#line 1966 "VBNET.ATG" +#line 2001 "VBNET.ATG" if (expr == null) { canBeRedim = false; expr = Expression.Null; } } -#line 1968 "VBNET.ATG" +#line 2003 "VBNET.ATG" if (expr != null) arguments.Add(expr); else canBeRedim = false; } void ArrayTypeModifiers( -#line 2055 "VBNET.ATG" +#line 2090 "VBNET.ATG" out ArrayList arrayModifiers) { -#line 2057 "VBNET.ATG" +#line 2092 "VBNET.ATG" arrayModifiers = new ArrayList(); int i = 0; while ( -#line 2060 "VBNET.ATG" +#line 2095 "VBNET.ATG" IsDims()) { Expect(25); if (la.kind == 12 || la.kind == 26) { RankList( -#line 2062 "VBNET.ATG" +#line 2097 "VBNET.ATG" out i); } -#line 2064 "VBNET.ATG" +#line 2099 "VBNET.ATG" arrayModifiers.Add(i); Expect(26); } -#line 2069 "VBNET.ATG" +#line 2104 "VBNET.ATG" if(arrayModifiers.Count == 0) { arrayModifiers = null; } @@ -4680,69 +4693,69 @@ out i); } void Argument( -#line 1972 "VBNET.ATG" +#line 2007 "VBNET.ATG" out Expression argumentexpr) { -#line 1974 "VBNET.ATG" +#line 2009 "VBNET.ATG" Expression expr; argumentexpr = null; string name; if ( -#line 1978 "VBNET.ATG" +#line 2013 "VBNET.ATG" IsNamedAssign()) { Identifier(); -#line 1978 "VBNET.ATG" +#line 2013 "VBNET.ATG" name = t.val; Expect(13); Expect(11); Expr( -#line 1978 "VBNET.ATG" +#line 2013 "VBNET.ATG" out expr); -#line 1980 "VBNET.ATG" +#line 2015 "VBNET.ATG" argumentexpr = new NamedArgumentExpression(name, expr); } else if (StartOf(27)) { Expr( -#line 1983 "VBNET.ATG" +#line 2018 "VBNET.ATG" out argumentexpr); } else SynErr(250); } void QualIdentAndTypeArguments( -#line 2029 "VBNET.ATG" +#line 2064 "VBNET.ATG" out TypeReference typeref, bool canBeUnbound) { -#line 2030 "VBNET.ATG" +#line 2065 "VBNET.ATG" string name; typeref = null; Qualident( -#line 2032 "VBNET.ATG" +#line 2067 "VBNET.ATG" out name); -#line 2033 "VBNET.ATG" +#line 2068 "VBNET.ATG" typeref = new TypeReference(name); if ( -#line 2034 "VBNET.ATG" +#line 2069 "VBNET.ATG" la.kind == Tokens.OpenParenthesis && Peek(1).kind == Tokens.Of) { lexer.NextToken(); Expect(202); if ( -#line 2036 "VBNET.ATG" +#line 2071 "VBNET.ATG" canBeUnbound && (la.kind == Tokens.CloseParenthesis || la.kind == Tokens.Comma)) { -#line 2037 "VBNET.ATG" +#line 2072 "VBNET.ATG" typeref.GenericTypes.Add(NullTypeReference.Instance); while (la.kind == 12) { lexer.NextToken(); -#line 2038 "VBNET.ATG" +#line 2073 "VBNET.ATG" typeref.GenericTypes.Add(NullTypeReference.Instance); } } else if (StartOf(6)) { TypeArgumentList( -#line 2039 "VBNET.ATG" +#line 2074 "VBNET.ATG" typeref.GenericTypes); } else SynErr(251); Expect(26); @@ -4750,48 +4763,48 @@ typeref.GenericTypes); } void TypeArgumentList( -#line 2082 "VBNET.ATG" +#line 2117 "VBNET.ATG" List typeArguments) { -#line 2084 "VBNET.ATG" +#line 2119 "VBNET.ATG" TypeReference typeref; TypeName( -#line 2086 "VBNET.ATG" +#line 2121 "VBNET.ATG" out typeref); -#line 2086 "VBNET.ATG" +#line 2121 "VBNET.ATG" if (typeref != null) typeArguments.Add(typeref); while (la.kind == 12) { lexer.NextToken(); TypeName( -#line 2089 "VBNET.ATG" +#line 2124 "VBNET.ATG" out typeref); -#line 2089 "VBNET.ATG" +#line 2124 "VBNET.ATG" if (typeref != null) typeArguments.Add(typeref); } } void RankList( -#line 2076 "VBNET.ATG" +#line 2111 "VBNET.ATG" out int i) { -#line 2077 "VBNET.ATG" +#line 2112 "VBNET.ATG" i = 0; while (la.kind == 12) { lexer.NextToken(); -#line 2078 "VBNET.ATG" +#line 2113 "VBNET.ATG" ++i; } } void Attribute( -#line 2117 "VBNET.ATG" +#line 2152 "VBNET.ATG" out ASTAttribute attribute) { -#line 2118 "VBNET.ATG" +#line 2153 "VBNET.ATG" string name; List positional = new List(); List named = new List(); @@ -4801,15 +4814,15 @@ out ASTAttribute attribute) { Expect(10); } Qualident( -#line 2123 "VBNET.ATG" +#line 2158 "VBNET.ATG" out name); if (la.kind == 25) { AttributeArguments( -#line 2124 "VBNET.ATG" +#line 2159 "VBNET.ATG" positional, named); } -#line 2126 "VBNET.ATG" +#line 2161 "VBNET.ATG" attribute = new ASTAttribute(name, positional, named); SetParent(positional, attribute); SetParent(named, attribute); @@ -4817,26 +4830,26 @@ positional, named); } void AttributeArguments( -#line 2133 "VBNET.ATG" +#line 2168 "VBNET.ATG" List positional, List named) { -#line 2135 "VBNET.ATG" +#line 2170 "VBNET.ATG" bool nameFound = false; string name = ""; Expression expr; Expect(25); if ( -#line 2141 "VBNET.ATG" +#line 2176 "VBNET.ATG" IsNotClosingParenthesis()) { if ( -#line 2143 "VBNET.ATG" +#line 2178 "VBNET.ATG" IsNamedAssign()) { -#line 2143 "VBNET.ATG" +#line 2178 "VBNET.ATG" nameFound = true; IdentifierOrKeyword( -#line 2144 "VBNET.ATG" +#line 2179 "VBNET.ATG" out name); if (la.kind == 13) { lexer.NextToken(); @@ -4844,10 +4857,10 @@ out name); Expect(11); } Expr( -#line 2146 "VBNET.ATG" +#line 2181 "VBNET.ATG" out expr); -#line 2148 "VBNET.ATG" +#line 2183 "VBNET.ATG" if (expr != null) { if (string.IsNullOrEmpty(name)) { positional.Add(expr); } else { named.Add(new NamedArgumentExpression(name, expr)); name = ""; } @@ -4856,13 +4869,13 @@ out expr); while (la.kind == 12) { lexer.NextToken(); if ( -#line 2156 "VBNET.ATG" +#line 2191 "VBNET.ATG" IsNamedAssign()) { -#line 2156 "VBNET.ATG" +#line 2191 "VBNET.ATG" nameFound = true; IdentifierOrKeyword( -#line 2157 "VBNET.ATG" +#line 2192 "VBNET.ATG" out name); if (la.kind == 13) { lexer.NextToken(); @@ -4870,14 +4883,14 @@ out name); Expect(11); } else if (StartOf(27)) { -#line 2159 "VBNET.ATG" +#line 2194 "VBNET.ATG" if (nameFound) Error("no positional argument after named argument"); } else SynErr(252); Expr( -#line 2160 "VBNET.ATG" +#line 2195 "VBNET.ATG" out expr); -#line 2160 "VBNET.ATG" +#line 2195 "VBNET.ATG" if (expr != null) { if(name == "") positional.Add(expr); else { named.Add(new NamedArgumentExpression(name, expr)); name = ""; } } @@ -4888,10 +4901,10 @@ out expr); } void FormalParameter( -#line 2217 "VBNET.ATG" +#line 2252 "VBNET.ATG" out ParameterDeclarationExpression p) { -#line 2219 "VBNET.ATG" +#line 2254 "VBNET.ATG" AttributeSection section; List attributes = new List(); TypeReference type = null; @@ -4902,36 +4915,36 @@ out ParameterDeclarationExpression p) { while (la.kind == 28) { AttributeSection( -#line 2228 "VBNET.ATG" +#line 2263 "VBNET.ATG" out section); -#line 2228 "VBNET.ATG" +#line 2263 "VBNET.ATG" attributes.Add(section); } - while (StartOf(33)) { + while (StartOf(35)) { ParameterModifier( -#line 2229 "VBNET.ATG" +#line 2264 "VBNET.ATG" mod); } Identifier(); -#line 2230 "VBNET.ATG" +#line 2265 "VBNET.ATG" string parameterName = t.val; if ( -#line 2231 "VBNET.ATG" +#line 2266 "VBNET.ATG" IsDims()) { ArrayTypeModifiers( -#line 2231 "VBNET.ATG" +#line 2266 "VBNET.ATG" out arrayModifiers); } if (la.kind == 49) { lexer.NextToken(); TypeName( -#line 2232 "VBNET.ATG" +#line 2267 "VBNET.ATG" out type); } -#line 2234 "VBNET.ATG" +#line 2269 "VBNET.ATG" if(type != null) { if (arrayModifiers != null) { if (type.RankSpecifier != null) { @@ -4947,11 +4960,11 @@ out type); if (la.kind == 11) { lexer.NextToken(); Expr( -#line 2246 "VBNET.ATG" +#line 2281 "VBNET.ATG" out expr); } -#line 2248 "VBNET.ATG" +#line 2283 "VBNET.ATG" mod.Check(); p = new ParameterDeclarationExpression(type, parameterName, mod.Modifier, expr); p.Attributes = attributes; @@ -4959,34 +4972,34 @@ out expr); } void ParameterModifier( -#line 2920 "VBNET.ATG" +#line 2955 "VBNET.ATG" ParamModifierList m) { if (la.kind == 56) { lexer.NextToken(); -#line 2921 "VBNET.ATG" +#line 2956 "VBNET.ATG" m.Add(ParameterModifiers.In); } else if (la.kind == 54) { lexer.NextToken(); -#line 2922 "VBNET.ATG" +#line 2957 "VBNET.ATG" m.Add(ParameterModifiers.Ref); } else if (la.kind == 138) { lexer.NextToken(); -#line 2923 "VBNET.ATG" +#line 2958 "VBNET.ATG" m.Add(ParameterModifiers.Optional); } else if (la.kind == 144) { lexer.NextToken(); -#line 2924 "VBNET.ATG" +#line 2959 "VBNET.ATG" m.Add(ParameterModifiers.Params); } else SynErr(253); } void Statement() { -#line 2277 "VBNET.ATG" +#line 2312 "VBNET.ATG" Statement stmt = null; Location startPos = la.Location; string label = String.Empty; @@ -4994,34 +5007,34 @@ ParamModifierList m) { if (la.kind == 1 || la.kind == 13) { } else if ( -#line 2283 "VBNET.ATG" +#line 2318 "VBNET.ATG" IsLabel()) { LabelName( -#line 2283 "VBNET.ATG" +#line 2318 "VBNET.ATG" out label); -#line 2285 "VBNET.ATG" +#line 2320 "VBNET.ATG" compilationUnit.AddChild(new LabelStatement(t.val)); Expect(13); Statement(); - } else if (StartOf(34)) { + } else if (StartOf(36)) { EmbeddedStatement( -#line 2288 "VBNET.ATG" +#line 2323 "VBNET.ATG" out stmt); -#line 2288 "VBNET.ATG" +#line 2323 "VBNET.ATG" compilationUnit.AddChild(stmt); - } else if (StartOf(35)) { + } else if (StartOf(37)) { LocalDeclarationStatement( -#line 2289 "VBNET.ATG" +#line 2324 "VBNET.ATG" out stmt); -#line 2289 "VBNET.ATG" +#line 2324 "VBNET.ATG" compilationUnit.AddChild(stmt); } else SynErr(254); -#line 2292 "VBNET.ATG" +#line 2327 "VBNET.ATG" if (stmt != null) { stmt.StartLocation = startPos; stmt.EndLocation = t.Location; @@ -5030,30 +5043,30 @@ out stmt); } void LabelName( -#line 2698 "VBNET.ATG" +#line 2733 "VBNET.ATG" out string name) { -#line 2700 "VBNET.ATG" +#line 2735 "VBNET.ATG" name = String.Empty; if (StartOf(13)) { Identifier(); -#line 2702 "VBNET.ATG" +#line 2737 "VBNET.ATG" name = t.val; } else if (la.kind == 5) { lexer.NextToken(); -#line 2703 "VBNET.ATG" +#line 2738 "VBNET.ATG" name = t.val; } else SynErr(255); } void EmbeddedStatement( -#line 2332 "VBNET.ATG" +#line 2367 "VBNET.ATG" out Statement statement) { -#line 2334 "VBNET.ATG" +#line 2369 "VBNET.ATG" Statement embeddedStatement = null; statement = null; Expression expr = null; @@ -5064,103 +5077,103 @@ out Statement statement) { case 95: { lexer.NextToken(); -#line 2340 "VBNET.ATG" +#line 2375 "VBNET.ATG" ExitType exitType = ExitType.None; switch (la.kind) { case 168: { lexer.NextToken(); -#line 2342 "VBNET.ATG" +#line 2377 "VBNET.ATG" exitType = ExitType.Sub; break; } case 101: { lexer.NextToken(); -#line 2344 "VBNET.ATG" +#line 2379 "VBNET.ATG" exitType = ExitType.Function; break; } case 147: { lexer.NextToken(); -#line 2346 "VBNET.ATG" +#line 2381 "VBNET.ATG" exitType = ExitType.Property; break; } case 84: { lexer.NextToken(); -#line 2348 "VBNET.ATG" +#line 2383 "VBNET.ATG" exitType = ExitType.Do; break; } case 99: { lexer.NextToken(); -#line 2350 "VBNET.ATG" +#line 2385 "VBNET.ATG" exitType = ExitType.For; break; } case 175: { lexer.NextToken(); -#line 2352 "VBNET.ATG" +#line 2387 "VBNET.ATG" exitType = ExitType.Try; break; } case 182: { lexer.NextToken(); -#line 2354 "VBNET.ATG" +#line 2389 "VBNET.ATG" exitType = ExitType.While; break; } case 156: { lexer.NextToken(); -#line 2356 "VBNET.ATG" +#line 2391 "VBNET.ATG" exitType = ExitType.Select; break; } default: SynErr(256); break; } -#line 2358 "VBNET.ATG" +#line 2393 "VBNET.ATG" statement = new ExitStatement(exitType); break; } case 175: { TryStatement( -#line 2359 "VBNET.ATG" +#line 2394 "VBNET.ATG" out statement); break; } case 188: { lexer.NextToken(); -#line 2360 "VBNET.ATG" +#line 2395 "VBNET.ATG" ContinueType continueType = ContinueType.None; if (la.kind == 84 || la.kind == 99 || la.kind == 182) { if (la.kind == 84) { lexer.NextToken(); -#line 2360 "VBNET.ATG" +#line 2395 "VBNET.ATG" continueType = ContinueType.Do; } else if (la.kind == 99) { lexer.NextToken(); -#line 2360 "VBNET.ATG" +#line 2395 "VBNET.ATG" continueType = ContinueType.For; } else { lexer.NextToken(); -#line 2360 "VBNET.ATG" +#line 2395 "VBNET.ATG" continueType = ContinueType.While; } } -#line 2360 "VBNET.ATG" +#line 2395 "VBNET.ATG" statement = new ContinueStatement(continueType); break; } @@ -5168,11 +5181,11 @@ out statement); lexer.NextToken(); if (StartOf(27)) { Expr( -#line 2362 "VBNET.ATG" +#line 2397 "VBNET.ATG" out expr); } -#line 2362 "VBNET.ATG" +#line 2397 "VBNET.ATG" statement = new ThrowStatement(expr); break; } @@ -5180,27 +5193,27 @@ out expr); lexer.NextToken(); if (StartOf(27)) { Expr( -#line 2364 "VBNET.ATG" +#line 2399 "VBNET.ATG" out expr); } -#line 2364 "VBNET.ATG" +#line 2399 "VBNET.ATG" statement = new ReturnStatement(expr); break; } case 169: { lexer.NextToken(); Expr( -#line 2366 "VBNET.ATG" +#line 2401 "VBNET.ATG" out expr); EndOfStmt(); Block( -#line 2366 "VBNET.ATG" +#line 2401 "VBNET.ATG" out embeddedStatement); Expect(89); Expect(169); -#line 2367 "VBNET.ATG" +#line 2402 "VBNET.ATG" statement = new LockStatement(expr, embeddedStatement); break; } @@ -5208,19 +5221,19 @@ out embeddedStatement); lexer.NextToken(); Identifier(); -#line 2369 "VBNET.ATG" +#line 2404 "VBNET.ATG" name = t.val; if (la.kind == 25) { lexer.NextToken(); - if (StartOf(30)) { + if (StartOf(32)) { ArgumentList( -#line 2370 "VBNET.ATG" +#line 2405 "VBNET.ATG" out p); } Expect(26); } -#line 2372 "VBNET.ATG" +#line 2407 "VBNET.ATG" statement = new RaiseEventStatement(name, p); SetParent(p, statement); @@ -5228,24 +5241,24 @@ out p); } case 183: { WithStatement( -#line 2376 "VBNET.ATG" +#line 2411 "VBNET.ATG" out statement); break; } case 43: { lexer.NextToken(); -#line 2378 "VBNET.ATG" +#line 2413 "VBNET.ATG" Expression handlerExpr = null; Expr( -#line 2379 "VBNET.ATG" +#line 2414 "VBNET.ATG" out expr); Expect(12); Expr( -#line 2379 "VBNET.ATG" +#line 2414 "VBNET.ATG" out handlerExpr); -#line 2381 "VBNET.ATG" +#line 2416 "VBNET.ATG" statement = new AddHandlerStatement(expr, handlerExpr); break; @@ -5253,17 +5266,17 @@ out handlerExpr); case 153: { lexer.NextToken(); -#line 2384 "VBNET.ATG" +#line 2419 "VBNET.ATG" Expression handlerExpr = null; Expr( -#line 2385 "VBNET.ATG" +#line 2420 "VBNET.ATG" out expr); Expect(12); Expr( -#line 2385 "VBNET.ATG" +#line 2420 "VBNET.ATG" out handlerExpr); -#line 2387 "VBNET.ATG" +#line 2422 "VBNET.ATG" statement = new RemoveHandlerStatement(expr, handlerExpr); break; @@ -5271,16 +5284,16 @@ out handlerExpr); case 182: { lexer.NextToken(); Expr( -#line 2390 "VBNET.ATG" +#line 2425 "VBNET.ATG" out expr); EndOfStmt(); Block( -#line 2391 "VBNET.ATG" +#line 2426 "VBNET.ATG" out embeddedStatement); Expect(89); Expect(182); -#line 2393 "VBNET.ATG" +#line 2428 "VBNET.ATG" statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.Start); break; @@ -5288,23 +5301,23 @@ out embeddedStatement); case 84: { lexer.NextToken(); -#line 2398 "VBNET.ATG" +#line 2433 "VBNET.ATG" ConditionType conditionType = ConditionType.None; if (la.kind == 178 || la.kind == 182) { WhileOrUntil( -#line 2401 "VBNET.ATG" +#line 2436 "VBNET.ATG" out conditionType); Expr( -#line 2401 "VBNET.ATG" +#line 2436 "VBNET.ATG" out expr); EndOfStmt(); Block( -#line 2402 "VBNET.ATG" +#line 2437 "VBNET.ATG" out embeddedStatement); Expect(119); -#line 2405 "VBNET.ATG" +#line 2440 "VBNET.ATG" statement = new DoLoopStatement(expr, embeddedStatement, conditionType == ConditionType.While ? ConditionType.DoWhile : conditionType, @@ -5313,19 +5326,19 @@ out embeddedStatement); } else if (la.kind == 1 || la.kind == 13) { EndOfStmt(); Block( -#line 2412 "VBNET.ATG" +#line 2447 "VBNET.ATG" out embeddedStatement); Expect(119); if (la.kind == 178 || la.kind == 182) { WhileOrUntil( -#line 2413 "VBNET.ATG" +#line 2448 "VBNET.ATG" out conditionType); Expr( -#line 2413 "VBNET.ATG" +#line 2448 "VBNET.ATG" out expr); } -#line 2415 "VBNET.ATG" +#line 2450 "VBNET.ATG" statement = new DoLoopStatement(expr, embeddedStatement, conditionType, ConditionPosition.End); } else SynErr(257); @@ -5334,7 +5347,7 @@ out expr); case 99: { lexer.NextToken(); -#line 2420 "VBNET.ATG" +#line 2455 "VBNET.ATG" Expression group = null; TypeReference typeReference; string typeName; @@ -5343,24 +5356,24 @@ out expr); if (la.kind == 86) { lexer.NextToken(); LoopControlVariable( -#line 2427 "VBNET.ATG" +#line 2462 "VBNET.ATG" out typeReference, out typeName); Expect(110); Expr( -#line 2428 "VBNET.ATG" +#line 2463 "VBNET.ATG" out group); EndOfStmt(); Block( -#line 2429 "VBNET.ATG" +#line 2464 "VBNET.ATG" out embeddedStatement); Expect(129); if (StartOf(27)) { Expr( -#line 2430 "VBNET.ATG" +#line 2465 "VBNET.ATG" out expr); } -#line 2432 "VBNET.ATG" +#line 2467 "VBNET.ATG" statement = new ForeachStatement(typeReference, typeName, group, @@ -5372,55 +5385,55 @@ out expr); } else if (StartOf(13)) { -#line 2443 "VBNET.ATG" +#line 2478 "VBNET.ATG" Expression start = null; Expression end = null; Expression step = null; Expression nextExpr = null;List nextExpressions = null; LoopControlVariable( -#line 2448 "VBNET.ATG" +#line 2483 "VBNET.ATG" out typeReference, out typeName); Expect(11); Expr( -#line 2449 "VBNET.ATG" +#line 2484 "VBNET.ATG" out start); Expect(173); Expr( -#line 2449 "VBNET.ATG" +#line 2484 "VBNET.ATG" out end); if (la.kind == 163) { lexer.NextToken(); Expr( -#line 2449 "VBNET.ATG" +#line 2484 "VBNET.ATG" out step); } EndOfStmt(); Block( -#line 2450 "VBNET.ATG" +#line 2485 "VBNET.ATG" out embeddedStatement); Expect(129); if (StartOf(27)) { Expr( -#line 2453 "VBNET.ATG" +#line 2488 "VBNET.ATG" out nextExpr); -#line 2455 "VBNET.ATG" +#line 2490 "VBNET.ATG" nextExpressions = new List(); nextExpressions.Add(nextExpr); while (la.kind == 12) { lexer.NextToken(); Expr( -#line 2458 "VBNET.ATG" +#line 2493 "VBNET.ATG" out nextExpr); -#line 2458 "VBNET.ATG" +#line 2493 "VBNET.ATG" nextExpressions.Add(nextExpr); } } -#line 2461 "VBNET.ATG" +#line 2496 "VBNET.ATG" statement = new ForNextStatement(typeReference, typeName, start, end, step, embeddedStatement, nextExpressions); SetParent(nextExpressions, statement); @@ -5430,29 +5443,29 @@ out nextExpr); case 93: { lexer.NextToken(); Expr( -#line 2466 "VBNET.ATG" +#line 2501 "VBNET.ATG" out expr); -#line 2466 "VBNET.ATG" +#line 2501 "VBNET.ATG" statement = new ErrorStatement(expr); break; } case 152: { lexer.NextToken(); -#line 2468 "VBNET.ATG" +#line 2503 "VBNET.ATG" bool isPreserve = false; if (la.kind == 145) { lexer.NextToken(); -#line 2468 "VBNET.ATG" +#line 2503 "VBNET.ATG" isPreserve = true; } ReDimClause( -#line 2469 "VBNET.ATG" +#line 2504 "VBNET.ATG" out expr); -#line 2471 "VBNET.ATG" +#line 2506 "VBNET.ATG" ReDimStatement reDimStatement = new ReDimStatement(isPreserve); statement = reDimStatement; SafeAdd(reDimStatement, reDimStatement.ReDimClauses, expr as InvocationExpression); @@ -5460,10 +5473,10 @@ out expr); while (la.kind == 12) { lexer.NextToken(); ReDimClause( -#line 2475 "VBNET.ATG" +#line 2510 "VBNET.ATG" out expr); -#line 2476 "VBNET.ATG" +#line 2511 "VBNET.ATG" SafeAdd(reDimStatement, reDimStatement.ReDimClauses, expr as InvocationExpression); } break; @@ -5471,41 +5484,41 @@ out expr); case 92: { lexer.NextToken(); Expr( -#line 2480 "VBNET.ATG" +#line 2515 "VBNET.ATG" out expr); -#line 2482 "VBNET.ATG" +#line 2517 "VBNET.ATG" EraseStatement eraseStatement = new EraseStatement(); if (expr != null) { SafeAdd(eraseStatement, eraseStatement.Expressions, expr);} while (la.kind == 12) { lexer.NextToken(); Expr( -#line 2485 "VBNET.ATG" +#line 2520 "VBNET.ATG" out expr); -#line 2485 "VBNET.ATG" +#line 2520 "VBNET.ATG" if (expr != null) { SafeAdd(eraseStatement, eraseStatement.Expressions, expr); } } -#line 2486 "VBNET.ATG" +#line 2521 "VBNET.ATG" statement = eraseStatement; break; } case 164: { lexer.NextToken(); -#line 2488 "VBNET.ATG" +#line 2523 "VBNET.ATG" statement = new StopStatement(); break; } case 107: { lexer.NextToken(); -#line 2490 "VBNET.ATG" +#line 2525 "VBNET.ATG" Location ifStartLocation = t.Location; Expr( -#line 2490 "VBNET.ATG" +#line 2525 "VBNET.ATG" out expr); if (la.kind == 171) { lexer.NextToken(); @@ -5513,46 +5526,46 @@ out expr); if (la.kind == 1 || la.kind == 13) { EndOfStmt(); Block( -#line 2493 "VBNET.ATG" +#line 2528 "VBNET.ATG" out embeddedStatement); -#line 2495 "VBNET.ATG" +#line 2530 "VBNET.ATG" IfElseStatement ifStatement = new IfElseStatement(expr, embeddedStatement); ifStatement.StartLocation = ifStartLocation; Location elseIfStart; while (la.kind == 88 || -#line 2501 "VBNET.ATG" +#line 2536 "VBNET.ATG" IsElseIf()) { if ( -#line 2501 "VBNET.ATG" +#line 2536 "VBNET.ATG" IsElseIf()) { Expect(87); -#line 2501 "VBNET.ATG" +#line 2536 "VBNET.ATG" elseIfStart = t.Location; Expect(107); } else { lexer.NextToken(); -#line 2502 "VBNET.ATG" +#line 2537 "VBNET.ATG" elseIfStart = t.Location; } -#line 2504 "VBNET.ATG" +#line 2539 "VBNET.ATG" Expression condition = null; Statement block = null; Expr( -#line 2505 "VBNET.ATG" +#line 2540 "VBNET.ATG" out condition); if (la.kind == 171) { lexer.NextToken(); } EndOfStmt(); Block( -#line 2506 "VBNET.ATG" +#line 2541 "VBNET.ATG" out block); -#line 2508 "VBNET.ATG" +#line 2543 "VBNET.ATG" ElseIfSection elseIfSection = new ElseIfSection(condition, block); elseIfSection.StartLocation = elseIfStart; elseIfSection.EndLocation = t.Location; @@ -5564,43 +5577,43 @@ out block); lexer.NextToken(); EndOfStmt(); Block( -#line 2517 "VBNET.ATG" +#line 2552 "VBNET.ATG" out embeddedStatement); -#line 2519 "VBNET.ATG" +#line 2554 "VBNET.ATG" ifStatement.FalseStatement.Add(embeddedStatement); } Expect(89); Expect(107); -#line 2523 "VBNET.ATG" +#line 2558 "VBNET.ATG" ifStatement.EndLocation = t.Location; statement = ifStatement; - } else if (StartOf(36)) { + } else if (StartOf(38)) { -#line 2528 "VBNET.ATG" +#line 2563 "VBNET.ATG" IfElseStatement ifStatement = new IfElseStatement(expr); ifStatement.StartLocation = ifStartLocation; SingleLineStatementList( -#line 2531 "VBNET.ATG" +#line 2566 "VBNET.ATG" ifStatement.TrueStatement); -#line 2533 "VBNET.ATG" +#line 2568 "VBNET.ATG" SetParent(ifStatement.TrueStatement, ifStatement); if (la.kind == 87) { lexer.NextToken(); - if (StartOf(36)) { + if (StartOf(38)) { SingleLineStatementList( -#line 2537 "VBNET.ATG" +#line 2572 "VBNET.ATG" ifStatement.FalseStatement); } } -#line 2539 "VBNET.ATG" +#line 2574 "VBNET.ATG" ifStatement.EndLocation = t.Location; statement = ifStatement; } else SynErr(259); break; @@ -5611,46 +5624,46 @@ ifStatement.FalseStatement); lexer.NextToken(); } Expr( -#line 2542 "VBNET.ATG" +#line 2577 "VBNET.ATG" out expr); EndOfStmt(); -#line 2543 "VBNET.ATG" +#line 2578 "VBNET.ATG" List selectSections = new List(); Statement block = null; while (la.kind == 58) { -#line 2547 "VBNET.ATG" +#line 2582 "VBNET.ATG" List caseClauses = null; Location caseLocation = la.Location; lexer.NextToken(); CaseClauses( -#line 2548 "VBNET.ATG" +#line 2583 "VBNET.ATG" out caseClauses); if ( -#line 2548 "VBNET.ATG" +#line 2583 "VBNET.ATG" IsNotStatementSeparator()) { lexer.NextToken(); } EndOfStmt(); -#line 2550 "VBNET.ATG" +#line 2585 "VBNET.ATG" SwitchSection selectSection = new SwitchSection(caseClauses); SetParent(caseClauses, selectSection); selectSection.StartLocation = caseLocation; Block( -#line 2554 "VBNET.ATG" +#line 2589 "VBNET.ATG" out block); -#line 2556 "VBNET.ATG" +#line 2591 "VBNET.ATG" selectSection.Children = block.Children; selectSection.EndLocation = t.EndLocation; selectSections.Add(selectSection); } -#line 2562 "VBNET.ATG" +#line 2597 "VBNET.ATG" statement = new SwitchStatement(expr, selectSections); SetParent(selectSections, statement); @@ -5660,43 +5673,43 @@ out block); } case 136: { -#line 2566 "VBNET.ATG" +#line 2601 "VBNET.ATG" OnErrorStatement onErrorStatement = null; OnErrorStatement( -#line 2567 "VBNET.ATG" +#line 2602 "VBNET.ATG" out onErrorStatement); -#line 2567 "VBNET.ATG" +#line 2602 "VBNET.ATG" statement = onErrorStatement; break; } case 105: { -#line 2568 "VBNET.ATG" +#line 2603 "VBNET.ATG" GotoStatement goToStatement = null; GotoStatement( -#line 2569 "VBNET.ATG" +#line 2604 "VBNET.ATG" out goToStatement); -#line 2569 "VBNET.ATG" +#line 2604 "VBNET.ATG" statement = goToStatement; break; } case 154: { -#line 2570 "VBNET.ATG" +#line 2605 "VBNET.ATG" ResumeStatement resumeStatement = null; ResumeStatement( -#line 2571 "VBNET.ATG" +#line 2606 "VBNET.ATG" out resumeStatement); -#line 2571 "VBNET.ATG" +#line 2606 "VBNET.ATG" statement = resumeStatement; break; } case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 25: case 44: case 48: case 50: case 51: case 52: case 53: case 55: case 60: case 61: case 62: case 63: case 64: case 65: case 66: case 67: case 69: case 70: case 71: case 73: case 74: case 75: case 76: case 77: case 78: case 83: case 85: case 96: case 97: case 103: case 112: case 118: case 120: case 125: case 126: case 128: case 131: case 134: case 135: case 145: case 160: case 161: case 166: case 170: case 174: case 176: case 177: case 178: case 192: case 193: case 194: case 195: case 196: case 197: case 198: case 199: case 200: case 201: case 206: { -#line 2574 "VBNET.ATG" +#line 2609 "VBNET.ATG" Expression val = null; AssignmentOperatorType op; @@ -5704,25 +5717,25 @@ out resumeStatement); la.kind == Tokens.Not || la.kind == Tokens.Times; SimpleExpr( -#line 2580 "VBNET.ATG" +#line 2615 "VBNET.ATG" out expr); - if (StartOf(37)) { + if (StartOf(39)) { AssignmentOperator( -#line 2582 "VBNET.ATG" +#line 2617 "VBNET.ATG" out op); Expr( -#line 2582 "VBNET.ATG" +#line 2617 "VBNET.ATG" out val); -#line 2582 "VBNET.ATG" +#line 2617 "VBNET.ATG" expr = new AssignmentExpression(expr, op, val); } else if (la.kind == 1 || la.kind == 13 || la.kind == 87) { -#line 2583 "VBNET.ATG" +#line 2618 "VBNET.ATG" if (mustBeAssignment) Error("error in assignment."); } else SynErr(260); -#line 2586 "VBNET.ATG" +#line 2621 "VBNET.ATG" // a field reference expression that stands alone is a // invocation expression without parantheses and arguments if(expr is MemberReferenceExpression || expr is IdentifierExpression) { @@ -5735,50 +5748,50 @@ out val); case 57: { lexer.NextToken(); SimpleExpr( -#line 2593 "VBNET.ATG" +#line 2628 "VBNET.ATG" out expr); -#line 2593 "VBNET.ATG" +#line 2628 "VBNET.ATG" statement = new ExpressionStatement(expr); break; } case 190: { lexer.NextToken(); -#line 2595 "VBNET.ATG" +#line 2630 "VBNET.ATG" Statement block; if ( -#line 2596 "VBNET.ATG" +#line 2631 "VBNET.ATG" Peek(1).kind == Tokens.As) { -#line 2597 "VBNET.ATG" +#line 2632 "VBNET.ATG" LocalVariableDeclaration resourceAquisition = new LocalVariableDeclaration(Modifiers.None); VariableDeclarator( -#line 2598 "VBNET.ATG" +#line 2633 "VBNET.ATG" resourceAquisition.Variables); while (la.kind == 12) { lexer.NextToken(); VariableDeclarator( -#line 2600 "VBNET.ATG" +#line 2635 "VBNET.ATG" resourceAquisition.Variables); } Block( -#line 2602 "VBNET.ATG" +#line 2637 "VBNET.ATG" out block); -#line 2604 "VBNET.ATG" +#line 2639 "VBNET.ATG" statement = new UsingStatement(resourceAquisition, block); SetParent(resourceAquisition.Variables, resourceAquisition); } else if (StartOf(27)) { Expr( -#line 2607 "VBNET.ATG" +#line 2642 "VBNET.ATG" out expr); Block( -#line 2608 "VBNET.ATG" +#line 2643 "VBNET.ATG" out block); -#line 2609 "VBNET.ATG" +#line 2644 "VBNET.ATG" statement = new UsingStatement(new ExpressionStatement(expr), block); } else SynErr(261); Expect(89); @@ -5790,10 +5803,10 @@ out block); } void LocalDeclarationStatement( -#line 2300 "VBNET.ATG" +#line 2335 "VBNET.ATG" out Statement statement) { -#line 2302 "VBNET.ATG" +#line 2337 "VBNET.ATG" ModifierList m = new ModifierList(); LocalVariableDeclaration localVariableDeclaration; bool dimfound = false; @@ -5802,22 +5815,22 @@ out Statement statement) { if (la.kind == 72) { lexer.NextToken(); -#line 2308 "VBNET.ATG" +#line 2343 "VBNET.ATG" m.Add(Modifiers.Const, t.Location); } else if (la.kind == 162) { lexer.NextToken(); -#line 2309 "VBNET.ATG" +#line 2344 "VBNET.ATG" m.Add(Modifiers.Static, t.Location); } else { lexer.NextToken(); -#line 2310 "VBNET.ATG" +#line 2345 "VBNET.ATG" dimfound = true; } } -#line 2313 "VBNET.ATG" +#line 2348 "VBNET.ATG" if(dimfound && (m.Modifier & Modifiers.Const) != 0) { Error("Dim is not allowed on constants."); } @@ -5830,136 +5843,136 @@ out Statement statement) { localVariableDeclaration.StartLocation = t.Location; VariableDeclarator( -#line 2324 "VBNET.ATG" +#line 2359 "VBNET.ATG" localVariableDeclaration.Variables); while (la.kind == 12) { lexer.NextToken(); VariableDeclarator( -#line 2325 "VBNET.ATG" +#line 2360 "VBNET.ATG" localVariableDeclaration.Variables); } -#line 2327 "VBNET.ATG" +#line 2362 "VBNET.ATG" SetParent(localVariableDeclaration.Variables, localVariableDeclaration); statement = localVariableDeclaration; } void TryStatement( -#line 2813 "VBNET.ATG" +#line 2848 "VBNET.ATG" out Statement tryStatement) { -#line 2815 "VBNET.ATG" +#line 2850 "VBNET.ATG" Statement blockStmt = null, finallyStmt = null;List catchClauses = null; Expect(175); EndOfStmt(); Block( -#line 2818 "VBNET.ATG" +#line 2853 "VBNET.ATG" out blockStmt); if (la.kind == 59 || la.kind == 89 || la.kind == 98) { CatchClauses( -#line 2819 "VBNET.ATG" +#line 2854 "VBNET.ATG" out catchClauses); } if (la.kind == 98) { lexer.NextToken(); EndOfStmt(); Block( -#line 2820 "VBNET.ATG" +#line 2855 "VBNET.ATG" out finallyStmt); } Expect(89); Expect(175); -#line 2823 "VBNET.ATG" +#line 2858 "VBNET.ATG" tryStatement = new TryCatchStatement(blockStmt, catchClauses, finallyStmt); } void WithStatement( -#line 2793 "VBNET.ATG" +#line 2828 "VBNET.ATG" out Statement withStatement) { -#line 2795 "VBNET.ATG" +#line 2830 "VBNET.ATG" Statement blockStmt = null; Expression expr = null; Expect(183); -#line 2798 "VBNET.ATG" +#line 2833 "VBNET.ATG" Location start = t.Location; Expr( -#line 2799 "VBNET.ATG" +#line 2834 "VBNET.ATG" out expr); EndOfStmt(); -#line 2801 "VBNET.ATG" +#line 2836 "VBNET.ATG" withStatement = new WithStatement(expr); withStatement.StartLocation = start; Block( -#line 2804 "VBNET.ATG" +#line 2839 "VBNET.ATG" out blockStmt); -#line 2806 "VBNET.ATG" +#line 2841 "VBNET.ATG" ((WithStatement)withStatement).Body = (BlockStatement)blockStmt; Expect(89); Expect(183); -#line 2809 "VBNET.ATG" +#line 2844 "VBNET.ATG" withStatement.EndLocation = t.Location; } void WhileOrUntil( -#line 2786 "VBNET.ATG" +#line 2821 "VBNET.ATG" out ConditionType conditionType) { -#line 2787 "VBNET.ATG" +#line 2822 "VBNET.ATG" conditionType = ConditionType.None; if (la.kind == 182) { lexer.NextToken(); -#line 2788 "VBNET.ATG" +#line 2823 "VBNET.ATG" conditionType = ConditionType.While; } else if (la.kind == 178) { lexer.NextToken(); -#line 2789 "VBNET.ATG" +#line 2824 "VBNET.ATG" conditionType = ConditionType.Until; } else SynErr(263); } void LoopControlVariable( -#line 2628 "VBNET.ATG" +#line 2663 "VBNET.ATG" out TypeReference type, out string name) { -#line 2629 "VBNET.ATG" +#line 2664 "VBNET.ATG" ArrayList arrayModifiers = null; type = null; Qualident( -#line 2633 "VBNET.ATG" +#line 2668 "VBNET.ATG" out name); if ( -#line 2634 "VBNET.ATG" +#line 2669 "VBNET.ATG" IsDims()) { ArrayTypeModifiers( -#line 2634 "VBNET.ATG" +#line 2669 "VBNET.ATG" out arrayModifiers); } if (la.kind == 49) { lexer.NextToken(); TypeName( -#line 2635 "VBNET.ATG" +#line 2670 "VBNET.ATG" out type); -#line 2635 "VBNET.ATG" +#line 2670 "VBNET.ATG" if (name.IndexOf('.') > 0) { Error("No type def for 'for each' member indexer allowed."); } } -#line 2637 "VBNET.ATG" +#line 2672 "VBNET.ATG" if (type != null) { if(type.RankSpecifier != null && arrayModifiers != null) { Error("array rank only allowed one time"); @@ -5971,34 +5984,34 @@ out type); } void ReDimClause( -#line 2707 "VBNET.ATG" +#line 2742 "VBNET.ATG" out Expression expr) { SimpleNonInvocationExpression( -#line 2709 "VBNET.ATG" +#line 2744 "VBNET.ATG" out expr); ReDimClauseInternal( -#line 2710 "VBNET.ATG" +#line 2745 "VBNET.ATG" ref expr); } void SingleLineStatementList( -#line 2614 "VBNET.ATG" +#line 2649 "VBNET.ATG" List list) { -#line 2615 "VBNET.ATG" +#line 2650 "VBNET.ATG" Statement embeddedStatement = null; if (la.kind == 89) { lexer.NextToken(); -#line 2617 "VBNET.ATG" +#line 2652 "VBNET.ATG" embeddedStatement = new EndStatement(); - } else if (StartOf(34)) { + } else if (StartOf(36)) { EmbeddedStatement( -#line 2618 "VBNET.ATG" +#line 2653 "VBNET.ATG" out embeddedStatement); } else SynErr(264); -#line 2619 "VBNET.ATG" +#line 2654 "VBNET.ATG" if (embeddedStatement != null) list.Add(embeddedStatement); while (la.kind == 13) { lexer.NextToken(); @@ -6008,62 +6021,62 @@ out embeddedStatement); if (la.kind == 89) { lexer.NextToken(); -#line 2621 "VBNET.ATG" +#line 2656 "VBNET.ATG" embeddedStatement = new EndStatement(); - } else if (StartOf(34)) { + } else if (StartOf(36)) { EmbeddedStatement( -#line 2622 "VBNET.ATG" +#line 2657 "VBNET.ATG" out embeddedStatement); } else SynErr(265); -#line 2623 "VBNET.ATG" +#line 2658 "VBNET.ATG" if (embeddedStatement != null) list.Add(embeddedStatement); } } void CaseClauses( -#line 2746 "VBNET.ATG" +#line 2781 "VBNET.ATG" out List caseClauses) { -#line 2748 "VBNET.ATG" +#line 2783 "VBNET.ATG" caseClauses = new List(); CaseLabel caseClause = null; CaseClause( -#line 2751 "VBNET.ATG" +#line 2786 "VBNET.ATG" out caseClause); -#line 2751 "VBNET.ATG" +#line 2786 "VBNET.ATG" if (caseClause != null) { caseClauses.Add(caseClause); } while (la.kind == 12) { lexer.NextToken(); CaseClause( -#line 2752 "VBNET.ATG" +#line 2787 "VBNET.ATG" out caseClause); -#line 2752 "VBNET.ATG" +#line 2787 "VBNET.ATG" if (caseClause != null) { caseClauses.Add(caseClause); } } } void OnErrorStatement( -#line 2648 "VBNET.ATG" +#line 2683 "VBNET.ATG" out OnErrorStatement stmt) { -#line 2650 "VBNET.ATG" +#line 2685 "VBNET.ATG" stmt = null; GotoStatement goToStatement = null; Expect(136); Expect(93); if ( -#line 2656 "VBNET.ATG" +#line 2691 "VBNET.ATG" IsNegativeLabelName()) { Expect(105); Expect(15); Expect(5); -#line 2658 "VBNET.ATG" +#line 2693 "VBNET.ATG" long intLabel = Int64.Parse(t.val); if(intLabel != 1) { Error("invalid label in on error statement."); @@ -6072,10 +6085,10 @@ IsNegativeLabelName()) { } else if (la.kind == 105) { GotoStatement( -#line 2664 "VBNET.ATG" +#line 2699 "VBNET.ATG" out goToStatement); -#line 2666 "VBNET.ATG" +#line 2701 "VBNET.ATG" string val = goToStatement.Label; // if value is numeric, make sure that is 0 @@ -6092,88 +6105,88 @@ out goToStatement); lexer.NextToken(); Expect(129); -#line 2680 "VBNET.ATG" +#line 2715 "VBNET.ATG" stmt = new OnErrorStatement(new ResumeStatement(true)); } else SynErr(266); } void GotoStatement( -#line 2686 "VBNET.ATG" +#line 2721 "VBNET.ATG" out GotoStatement goToStatement) { -#line 2688 "VBNET.ATG" +#line 2723 "VBNET.ATG" string label = String.Empty; Expect(105); LabelName( -#line 2691 "VBNET.ATG" +#line 2726 "VBNET.ATG" out label); -#line 2693 "VBNET.ATG" +#line 2728 "VBNET.ATG" goToStatement = new GotoStatement(label); } void ResumeStatement( -#line 2735 "VBNET.ATG" +#line 2770 "VBNET.ATG" out ResumeStatement resumeStatement) { -#line 2737 "VBNET.ATG" +#line 2772 "VBNET.ATG" resumeStatement = null; string label = String.Empty; if ( -#line 2740 "VBNET.ATG" +#line 2775 "VBNET.ATG" IsResumeNext()) { Expect(154); Expect(129); -#line 2741 "VBNET.ATG" +#line 2776 "VBNET.ATG" resumeStatement = new ResumeStatement(true); } else if (la.kind == 154) { lexer.NextToken(); - if (StartOf(38)) { + if (StartOf(40)) { LabelName( -#line 2742 "VBNET.ATG" +#line 2777 "VBNET.ATG" out label); } -#line 2742 "VBNET.ATG" +#line 2777 "VBNET.ATG" resumeStatement = new ResumeStatement(label); } else SynErr(267); } void ReDimClauseInternal( -#line 2713 "VBNET.ATG" +#line 2748 "VBNET.ATG" ref Expression expr) { -#line 2714 "VBNET.ATG" +#line 2749 "VBNET.ATG" List arguments; bool canBeNormal; bool canBeRedim; string name; while (la.kind == 10 || -#line 2717 "VBNET.ATG" +#line 2752 "VBNET.ATG" la.kind == Tokens.OpenParenthesis && Peek(1).kind == Tokens.Of) { if (la.kind == 10) { lexer.NextToken(); IdentifierOrKeyword( -#line 2716 "VBNET.ATG" +#line 2751 "VBNET.ATG" out name); -#line 2716 "VBNET.ATG" +#line 2751 "VBNET.ATG" expr = new MemberReferenceExpression(expr, name); } else { InvocationExpression( -#line 2718 "VBNET.ATG" +#line 2753 "VBNET.ATG" ref expr); } } Expect(25); NormalOrReDimArgumentList( -#line 2721 "VBNET.ATG" +#line 2756 "VBNET.ATG" out arguments, out canBeNormal, out canBeRedim); Expect(26); -#line 2723 "VBNET.ATG" +#line 2758 "VBNET.ATG" expr = new InvocationExpression(expr, arguments); SetParent(arguments, expr); if (canBeRedim == false || canBeNormal && (la.kind == Tokens.Dot || la.kind == Tokens.OpenParenthesis)) { @@ -6186,10 +6199,10 @@ out arguments, out canBeNormal, out canBeRedim); } void CaseClause( -#line 2756 "VBNET.ATG" +#line 2791 "VBNET.ATG" out CaseLabel caseClause) { -#line 2758 "VBNET.ATG" +#line 2793 "VBNET.ATG" Expression expr = null; Expression sexpr = null; BinaryOperatorType op = BinaryOperatorType.None; @@ -6198,9 +6211,9 @@ out CaseLabel caseClause) { if (la.kind == 87) { lexer.NextToken(); -#line 2764 "VBNET.ATG" +#line 2799 "VBNET.ATG" caseClause = new CaseLabel(); - } else if (StartOf(39)) { + } else if (StartOf(41)) { if (la.kind == 114) { lexer.NextToken(); } @@ -6208,76 +6221,76 @@ out CaseLabel caseClause) { case 28: { lexer.NextToken(); -#line 2768 "VBNET.ATG" +#line 2803 "VBNET.ATG" op = BinaryOperatorType.LessThan; break; } case 27: { lexer.NextToken(); -#line 2769 "VBNET.ATG" +#line 2804 "VBNET.ATG" op = BinaryOperatorType.GreaterThan; break; } case 31: { lexer.NextToken(); -#line 2770 "VBNET.ATG" +#line 2805 "VBNET.ATG" op = BinaryOperatorType.LessThanOrEqual; break; } case 30: { lexer.NextToken(); -#line 2771 "VBNET.ATG" +#line 2806 "VBNET.ATG" op = BinaryOperatorType.GreaterThanOrEqual; break; } case 11: { lexer.NextToken(); -#line 2772 "VBNET.ATG" +#line 2807 "VBNET.ATG" op = BinaryOperatorType.Equality; break; } case 29: { lexer.NextToken(); -#line 2773 "VBNET.ATG" +#line 2808 "VBNET.ATG" op = BinaryOperatorType.InEquality; break; } default: SynErr(268); break; } Expr( -#line 2775 "VBNET.ATG" +#line 2810 "VBNET.ATG" out expr); -#line 2777 "VBNET.ATG" +#line 2812 "VBNET.ATG" caseClause = new CaseLabel(op, expr); } else if (StartOf(27)) { Expr( -#line 2779 "VBNET.ATG" +#line 2814 "VBNET.ATG" out expr); if (la.kind == 173) { lexer.NextToken(); Expr( -#line 2779 "VBNET.ATG" +#line 2814 "VBNET.ATG" out sexpr); } -#line 2781 "VBNET.ATG" +#line 2816 "VBNET.ATG" caseClause = new CaseLabel(expr, sexpr); } else SynErr(269); } void CatchClauses( -#line 2828 "VBNET.ATG" +#line 2863 "VBNET.ATG" out List catchClauses) { -#line 2830 "VBNET.ATG" +#line 2865 "VBNET.ATG" catchClauses = new List(); TypeReference type = null; Statement blockStmt = null; @@ -6289,27 +6302,27 @@ out List catchClauses) { if (StartOf(13)) { Identifier(); -#line 2838 "VBNET.ATG" +#line 2873 "VBNET.ATG" name = t.val; if (la.kind == 49) { lexer.NextToken(); TypeName( -#line 2838 "VBNET.ATG" +#line 2873 "VBNET.ATG" out type); } } if (la.kind == 181) { lexer.NextToken(); Expr( -#line 2839 "VBNET.ATG" +#line 2874 "VBNET.ATG" out expr); } EndOfStmt(); Block( -#line 2841 "VBNET.ATG" +#line 2876 "VBNET.ATG" out blockStmt); -#line 2842 "VBNET.ATG" +#line 2877 "VBNET.ATG" catchClauses.Add(new CatchClause(type, name, blockStmt, expr)); } } @@ -6638,6 +6651,8 @@ out blockStmt); {x,x,T,T, T,T,T,T, T,T,T,x, x,x,T,T, T,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, T,x,T,T, T,T,x,T, x,x,x,x, T,T,T,T, T,T,T,T, x,T,T,T, x,T,T,T, T,T,T,x, x,x,x,T, x,T,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,x,T, x,x,x,x, x,x,x,x, T,x,x,x, x,x,T,x, T,x,x,x, x,T,T,x, T,x,T,T, x,x,T,T, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,T,x, x,x,T,x, x,x,T,x, T,T,T,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,T,T, T,T,T,T, T,T,x,x, x,x,T,x, x}, {x,x,T,T, T,T,T,T, T,T,T,x, x,x,T,T, T,x,x,x, x,x,x,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, T,x,T,T, T,T,x,T, x,x,x,x, T,T,T,T, T,T,T,T, x,T,T,T, x,T,T,T, T,T,T,x, x,x,x,T, x,T,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,x,T, x,x,x,x, x,x,x,x, T,x,x,x, x,x,T,x, T,x,x,x, x,T,T,x, T,x,T,T, x,x,T,T, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,T,x, x,x,T,x, x,x,T,x, T,T,T,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,T,T, T,T,T,T, T,T,x,x, x,x,T,x, x}, {x,x,T,T, T,T,T,T, T,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, T,x,T,T, T,T,x,T, x,x,x,x, T,T,T,T, T,T,T,T, x,T,T,T, x,T,T,T, T,T,T,x, x,x,x,T, x,T,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,x,T, x,x,x,x, x,x,x,x, T,x,x,x, x,x,T,x, T,x,x,x, x,T,T,x, T,x,x,T, x,x,T,T, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,T,x, x,x,T,x, x,x,T,x, T,T,T,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,T,T, T,T,T,T, T,T,x,x, x,x,T,x, x}, + {x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,T, x,x,x,x, x,x,x,x, x,x,T,x, x,x,x,x, x,x,x,x, x,T,T,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,T,T, x,x,x,x, x,x,x,x, x,x,x,x, x}, + {x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,T,T, T,T,x,T, x,T,T,x, x,T,T,T, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,T,T, x,x,x,x, x,x,x,x, x}, {x,x,T,T, T,T,T,T, T,T,T,x, T,x,T,T, T,x,x,x, x,x,x,x, x,T,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, T,x,T,T, T,T,x,T, x,x,x,x, T,T,T,T, T,T,T,T, x,T,T,T, x,T,T,T, T,T,T,x, x,x,x,T, x,T,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,x,T, x,x,x,x, x,x,x,x, T,x,x,x, x,x,T,x, T,x,x,x, x,T,T,x, T,x,T,T, x,x,T,T, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,T,x, x,x,T,x, x,x,T,x, T,T,T,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,T,T, T,T,T,T, T,T,x,x, x,x,T,x, x}, {x,x,x,x, x,x,x,x, x,x,x,T, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, T,T,T,T, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x}, {x,x,T,T, T,T,T,T, T,T,T,x, x,x,T,T, T,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, T,x,T,T, T,T,x,T, x,x,x,x, T,T,T,T, T,T,T,T, x,T,T,T, x,T,T,T, T,T,T,x, x,x,x,T, x,T,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,x,T, x,x,x,x, x,x,x,x, T,x,x,x, x,x,T,x, T,x,x,x, x,T,T,x, T,x,x,T, x,x,T,T, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,T,x, x,x,T,x, x,x,T,x, T,T,T,x, x,x,x,x, x,x,x,x, x,x,x,x, T,T,T,T, T,T,T,T, T,T,x,x, x,x,T,x, x}, diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG index 3caefc0c07..c9ae004270 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG @@ -1673,6 +1673,7 @@ SimpleNonInvocationExpression | /* 11.4.5 */ "AddressOf" Expr (. pexpr = new AddressOfExpression(expr); .) | /* 11.5.1 */ "GetType" "(" GetTypeTypeName ")" (. pexpr = new TypeOfExpression(type); .) | /* 11.5.2 */ "TypeOf" SimpleExpr "Is" TypeName (. pexpr = new TypeOfIsExpression(expr, type); .) + | /* 11.22 */ IF (la.kind == Tokens.If) ConditionalExpression ) | /* this form only occurs in WithStatements*/ @@ -1680,6 +1681,40 @@ SimpleNonInvocationExpression ) . +ConditionalExpression + (. + ConditionalExpression conditionalExpression = new ConditionalExpression(); + BinaryOperatorExpression binaryOperatorExpression = new BinaryOperatorExpression(); + conditionalExpression.StartLocation = binaryOperatorExpression.StartLocation = la.Location; + + Expression condition = null; + Expression trueExpr = null; + Expression falseExpr = null; + .) += + "If" "(" Expr "," Expr [ "," Expr ] ")" + (. + if(falseExpr != null) + { + conditionalExpression.Condition = condition; + conditionalExpression.TrueExpression = trueExpr; + conditionalExpression.FalseExpression = falseExpr; + conditionalExpression.EndLocation = t.EndLocation; + + expr = conditionalExpression; + } + else + { + binaryOperatorExpression.Left = condition; + binaryOperatorExpression.Right = trueExpr; + binaryOperatorExpression.Op = BinaryOperatorType.NullCoalescing; + binaryOperatorExpression.EndLocation = t.EndLocation; + + expr = binaryOperatorExpression; + } + .) +. + InvocationExpression (. List typeParameters = new List(); List parameters = null; diff --git a/src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs b/src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs index 4a766d03e1..5e89adcb48 100644 --- a/src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:2.0.50727.1434 +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:2.0.50727.3053 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. // //------------------------------------------------------------------------------ diff --git a/src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs b/src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs index ed08dce52a..99fe67e854 100644 --- a/src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs +++ b/src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:2.0.50727.1434 +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:2.0.50727.3053 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. // //------------------------------------------------------------------------------ diff --git a/src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs b/src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs index f40c2eb813..3ec47962f6 100644 --- a/src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:2.0.50727.1434 +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:2.0.50727.3053 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. // //------------------------------------------------------------------------------ diff --git a/src/Libraries/NRefactory/Test/Parser/Expressions/BinaryOperatorExpressionTests.cs b/src/Libraries/NRefactory/Test/Parser/Expressions/BinaryOperatorExpressionTests.cs index eb57c2f53b..f8b3105baf 100644 --- a/src/Libraries/NRefactory/Test/Parser/Expressions/BinaryOperatorExpressionTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/Expressions/BinaryOperatorExpressionTests.cs @@ -432,8 +432,14 @@ namespace ICSharpCode.NRefactory.Tests.Ast { VBNetTestBinaryOperatorExpressionTest("a Like b", BinaryOperatorType.Like); } - #endregion + [Test] + public void VBNetNullCoalescingTest() + { + VBNetTestBinaryOperatorExpressionTest("If(a, b)", BinaryOperatorType.NullCoalescing); + } + + #endregion #region AddIntegerTests string AddIntegerToBoe(string input, int number) diff --git a/src/Libraries/NRefactory/Test/Parser/Expressions/ConditionalExpressionTests.cs b/src/Libraries/NRefactory/Test/Parser/Expressions/ConditionalExpressionTests.cs index 931f458b96..4c323cb0f5 100644 --- a/src/Libraries/NRefactory/Test/Parser/Expressions/ConditionalExpressionTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/Expressions/ConditionalExpressionTests.cs @@ -91,7 +91,17 @@ namespace ICSharpCode.NRefactory.Tests.Ast #endregion #region VB.NET - // No VB.NET representation + + [Test] + public void VBNetConditionalExpressionTest() + { + ConditionalExpression ce = ParseUtilVBNet.ParseExpression("If(x IsNot Nothing, x.Test, \"nothing\")"); + + Assert.IsTrue(ce.Condition is BinaryOperatorExpression); + Assert.IsTrue(ce.TrueExpression is MemberReferenceExpression); + Assert.IsTrue(ce.FalseExpression is PrimitiveExpression); + } + #endregion } }