From efa6ff705a3ab2e0817a9e304afe4429ee6fbc9a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 18 Sep 2009 22:08:43 +0000 Subject: [PATCH 01/13] Search for SDK tools in Windows 7 SDK. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4967 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Services/FileUtility/FileUtility.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs index 4b7666ea8c..4d4ff73e19 100644 --- a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs +++ b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs @@ -131,6 +131,19 @@ namespace ICSharpCode.Core } } + static string windowsSdk70InstallRoot = null; + /// + /// Location of the .NET 3.5 SP1 SDK (Windows SDK 7.0) install root. + /// + public static string WindowsSdk70InstallRoot { + get { + if (windowsSdk70InstallRoot == null) { + windowsSdk70InstallRoot = GetPathFromRegistry(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0", "InstallationFolder") ?? string.Empty; + } + return windowsSdk70InstallRoot; + } + } + #endregion public static string Combine(params string[] paths) @@ -185,6 +198,10 @@ namespace ICSharpCode.Core /// The path of the executable, or null if the exe is not found. public static string GetSdkPath(string exeName) { string execPath; + if (!string.IsNullOrEmpty(WindowsSdk70InstallRoot)) { + execPath = Path.Combine(WindowsSdk70InstallRoot, "bin\\" + exeName); + if (File.Exists(execPath)) { return execPath; } + } if (!string.IsNullOrEmpty(WindowsSdk61InstallRoot)) { execPath = Path.Combine(WindowsSdk61InstallRoot, "bin\\" + exeName); if (File.Exists(execPath)) { return execPath; } From bccf8b8dd318dc3dee3ce6df6e5fc60b41dd4d92 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 19 Sep 2009 00:10:54 +0000 Subject: [PATCH 02/13] - added WPF assembly key for "Do not profile .NET internals" - fixed hot path selection git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4968 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Frontend/Controls/QueryView.xaml.cs | 8 ++++---- .../Misc/Profiler/Hook/ProfilerMetaData.cpp | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/AddIns/Misc/Profiler/Frontend/Controls/QueryView.xaml.cs b/src/AddIns/Misc/Profiler/Frontend/Controls/QueryView.xaml.cs index 0ac80e8f2f..d90266d9dd 100644 --- a/src/AddIns/Misc/Profiler/Frontend/Controls/QueryView.xaml.cs +++ b/src/AddIns/Misc/Profiler/Frontend/Controls/QueryView.xaml.cs @@ -308,17 +308,17 @@ namespace ICSharpCode.Profiler.Controls void BtnExpandHotPathSubtreeClick(object sender, RoutedEventArgs e) { foreach (CallTreeNodeViewModel node in this.SelectedItems.ToArray()) { - ExpandHotPathItems(node); + ExpandHotPathItems(node, node); } } - void ExpandHotPathItems(CallTreeNodeViewModel parent) + void ExpandHotPathItems(CallTreeNodeViewModel parent, CallTreeNodeViewModel selectedRoot) { - if (parent.HotPathIndicatorVisibility == Visibility.Visible) { + if ((parent.CpuCyclesSpent / (double)selectedRoot.CpuCyclesSpent) >= 0.2) { parent.IsExpanded = true; foreach (CallTreeNodeViewModel node in parent.Children) - ExpandHotPathItems(node); + ExpandHotPathItems(node, selectedRoot); } } diff --git a/src/AddIns/Misc/Profiler/Hook/ProfilerMetaData.cpp b/src/AddIns/Misc/Profiler/Hook/ProfilerMetaData.cpp index d90fd05df0..a3dd180da6 100644 --- a/src/AddIns/Misc/Profiler/Hook/ProfilerMetaData.cpp +++ b/src/AddIns/Misc/Profiler/Hook/ProfilerMetaData.cpp @@ -528,8 +528,10 @@ bool SignatureReader::ReadCompressedInt(int *out) return true; } +// public key token: b77a5c561934e089 const byte mscorlibkey[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +// public key token: b03f5f7f11d50a3a const byte systemdrawingkey[] = { 0x00, 0x24, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x52, 0x53, 0x41, 0x31, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, 0xD1, @@ -543,6 +545,20 @@ const byte systemdrawingkey[] = { 0xC0, 0x93, 0x34, 0x4D, 0x5A, 0xD2, 0x93 }; +// public key token: 31bf3856ad364e35 +const byte wpfassemblieskey[] = { + 0x00, 0x24, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x52, 0x53, 0x41, 0x31, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0xB5, 0xFC, + 0x90, 0xE7, 0x02, 0x7F, 0x67, 0x87, 0x1E, 0x77, 0x3A, 0x8F, 0xDE, 0x89, 0x38, 0xC8, 0x1D, 0xD4, 0x02, + 0xBA, 0x65, 0xB9, 0x20, 0x1D, 0x60, 0x59, 0x3E, 0x96, 0xC4, 0x92, 0x65, 0x1E, 0x88, 0x9C, 0xC1, 0x3F, + 0x14, 0x15, 0xEB, 0xB5, 0x3F, 0xAC, 0x11, 0x31, 0xAE, 0x0B, 0xD3, 0x33, 0xC5, 0xEE, 0x60, 0x21, 0x67, + 0x2D, 0x97, 0x18, 0xEA, 0x31, 0xA8, 0xAE, 0xBD, 0x0D, 0xA0, 0x07, 0x2F, 0x25, 0xD8, 0x7D, 0xBA, 0x6F, + 0xC9, 0x0F, 0xFD, 0x59, 0x8E, 0xD4, 0xDA, 0x35, 0xE4, 0x4C, 0x39, 0x8C, 0x45, 0x43, 0x07, 0xE8, 0xE3, + 0x3B, 0x84, 0x26, 0x14, 0x3D, 0xAE, 0xC9, 0xF5, 0x96, 0x83, 0x6F, 0x97, 0xC8, 0xF7, 0x47, 0x50, 0xE5, + 0x97, 0x5C, 0x64, 0xE2, 0x18, 0x9F, 0x45, 0xDE, 0xF4, 0x6B, 0x2A, 0x2B, 0x12, 0x47, 0xAD, 0xC3, 0x65, + 0x2B, 0xF5, 0xC3, 0x08, 0x05, 0x5D, 0xA9 +}; + bool SignatureReader::IsNetInternal(FunctionID fid) { @@ -567,6 +583,8 @@ bool SignatureReader::IsNetInternal(FunctionID fid) return true; if (pKLength == sizeof(systemdrawingkey) && memcmp(systemdrawingkey, b, sizeof(systemdrawingkey)) == 0) return true; + if (pKLength == sizeof(wpfassemblieskey) && memcmp(wpfassemblieskey, b, sizeof(wpfassemblieskey)) == 0) + return true; } } From 6543362d93d605561a416ed901b204aa8b877ea5 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 21 Sep 2009 15:11:04 +0000 Subject: [PATCH 03/13] Update string resources. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4976 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- data/resources/StringResources.de.resources | Bin 344287 -> 344412 bytes data/resources/StringResources.fr.resources | Bin 340510 -> 346686 bytes data/resources/StringResources.nl.resources | Bin 341681 -> 342116 bytes .../Resources/StringResources.resources | Bin 332779 -> 333244 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/resources/StringResources.de.resources b/data/resources/StringResources.de.resources index 80b3adfe1af3405037100ba674b2d169f206d6dd..498ec8a53c38c1be4223a5e0adbdfbc21b8022af 100644 GIT binary patch delta 47305 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 QVbfy6%$sAwj3s{m5BZ|1;s5{u delta 46647 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�xZLHf403(#{{>cL~Bgh6(sOGoPbr)-r6Guyd;?8uQqHi0~zqip0 zC!DzyeSjPndio`T9g&`5=_EMFG);Q|npU1lBTMf?@o(LMdyS7d-N8ABBw!B^*ufG^ zEAGOTALmJ1--4+LTY%vK{ee~J63<0vQ4?hOXO_$HRxQZU> z2kTf{D766+`543YP$ak3`qdWIHWg|s-j^3~$w{@99ts9FZDojWmL-R`Pf+6w5O**W z6M+6~S#6us3ek=hs&91A9-p^*5~d8DMs@;I*$9RTMc?^VCL*C`nVB!K81G_Y(!UgT2O{^=Vu2oOV(3Zl zAHfuMrQW3&G}%wNzOr~4wKqEVYieEswHO2ZcoV)8tuH}0PxYp#%SK7REx|}y?rqV3 z0z$E+FqvBf;|PqM6{YZ~?u&ZFXvJXJO|T3m@8__PgP&oq`mHxPzs4FGkPy203>(9o zB40uo0l-1IIy$Q%CXx`uj0a)oJO#a29XX2G;ukQh-bl*+3P#eWQmR#8IZ7|O^a9g# z69A>Cqwx?VN*M+Vvgswxr6fyklV8EcevO}Lgr7a==YP?ZDOCDjKAUCMp``by)`5R` zl#6&%w67GkI?=I6#N>~(4&7v_{m4Q6#v35E&Ughq@xd|--GNWDKPvsZ(zhy^S9WfZ$iD^ z@Dvv7qlEeH4VL0~(&{bF#&)ILx4e(m2gvaPIfPoh!zyRAIlWY*GmOka=*c^%cQ(>e zX@jYH8HVL9>iHhWa!&$0PIU;taoXi_>2NA6gIfJbcgy%BR_dcnz@!g|mAv;+_DLk@ z&GXCi6<5fF(#mr1!nBiaEHd%ILZ)}4cRD>*kYHo* zS|spOrgvu&l?VVhX@l_+aRN231aTtmt@{?Z5o}Ri)p-IB4+@KCTZdbT=kR;W(|xP!DzhNj z?5?Eu(e{H4lvS{Cw9&h3MMx)`)2beiXs(SuUbFKPc?)dx_!cm#$9()$SAd&`qj>d8 z6%r%SB+Ffu^}$+uq@m)X2skF5Y^0wOs;mScp}HA(h)*Ac+n|NE`Z%`Ak4mfP+t8pY zdJk??Sch^xl~snGWSH`TQ*j25MpTgc&j62DXBFiXA&~gsT;;w9`l7 zc4-}ZeXygNp<7yYl&?*X7r;o}97?v=$FQaKWM7~-8#-+dnQpD8#>;I7=;#^Bb3j7^ zFJmsfQcv~?;4b1zhvKnyWVX;=q8`#C^&sT=Qj8;n^|qc6eMhGESDlX>S9*vX;q*D_ zTdA`U!pPwR1`X*y(!2LJqXrz=pE7dBz5xBN`vSC;ZvO|j Cj)Z#v diff --git a/data/resources/StringResources.fr.resources b/data/resources/StringResources.fr.resources index f65f4f07d1121f6f014cb30600f3e24875575ed2..2e6e1f9db62ccb9e4c8fae836b2a8142a6636fa8 100644 GIT binary patch delta 53222 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 I)T>thACHV6*#H0l delta 48571 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

W4czhcTxp4m#a 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 S?5`w1myV*)bMI-hUH=c%1OIUV diff --git a/src/Main/StartUp/Project/Resources/StringResources.resources b/src/Main/StartUp/Project/Resources/StringResources.resources index 3f324ffbb4c4a5baea3b8d59e852d96317eb471f..bb9a582e2109e057557aeccd846b0a7dcb13fc81 100644 GIT binary patch delta 47530 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 delta 46845 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 z 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 DxOF-q From 835431f6ab31c3401fbb2c532352575d4ec0e6be Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 21 Sep 2009 15:30:19 +0000 Subject: [PATCH 04/13] Fixed bug in code determining the size of the name column in the profiler. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4977 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Profiler/Frontend/Controls/EventLine.cs | 5 ---- .../Frontend/Controls/QueryView.xaml.cs | 26 +++++++++++++------ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/AddIns/Misc/Profiler/Frontend/Controls/EventLine.cs b/src/AddIns/Misc/Profiler/Frontend/Controls/EventLine.cs index 18c32046ae..16bd911fd5 100644 --- a/src/AddIns/Misc/Profiler/Frontend/Controls/EventLine.cs +++ b/src/AddIns/Misc/Profiler/Frontend/Controls/EventLine.cs @@ -20,9 +20,4 @@ namespace ICSharpCode.Profiler.Controls } } - - class EventItem - { - int dataSet; - } } diff --git a/src/AddIns/Misc/Profiler/Frontend/Controls/QueryView.xaml.cs b/src/AddIns/Misc/Profiler/Frontend/Controls/QueryView.xaml.cs index d90266d9dd..53115436d7 100644 --- a/src/AddIns/Misc/Profiler/Frontend/Controls/QueryView.xaml.cs +++ b/src/AddIns/Misc/Profiler/Frontend/Controls/QueryView.xaml.cs @@ -166,16 +166,26 @@ namespace ICSharpCode.Profiler.Controls this.Translation = new ControlsTranslation(); this.treeView.SizeChanged += delegate(object sender, SizeChangedEventArgs e) { - if (e.NewSize.Width > 0 && e.PreviousSize.Width > 0 && - (nameColumn.Width + (e.NewSize.Width - e.PreviousSize.Width)) > 0) { - double newValue = e.NewSize.Width - this.callCountColumn.Width + if (e.NewSize.Width > 0 && e.PreviousSize.Width > 0) { + double adjustedNameColumnWidth = nameColumn.Width + e.NewSize.Width - e.PreviousSize.Width; + double matchingNameColumnWidth = e.NewSize.Width - this.callCountColumn.Width - this.percentColumn.Width - this.timeSpentColumn.Width - this.timeSpentSelfColumn.Width - this.timeSpentPerCallColumn.Width - - this.timeSpentSelfPerCallColumn.Width; - if ((nameColumn.Width + (e.NewSize.Width - e.PreviousSize.Width)) >= newValue) - this.nameColumn.Width = newValue - 25; - else - nameColumn.Width += (e.NewSize.Width - e.PreviousSize.Width); + - this.timeSpentSelfPerCallColumn.Width - 25; + + // always keep name column at least 75 pixels wide + if (matchingNameColumnWidth < 75) + matchingNameColumnWidth = 75; + + if (e.NewSize.Width >= e.PreviousSize.Width) { + // treeView got wider: also make name column wider if there's space free + if (adjustedNameColumnWidth <= matchingNameColumnWidth) + nameColumn.Width = adjustedNameColumnWidth; + } else { + // treeView got smaller: make column smaller unless there's space free + if (adjustedNameColumnWidth >= matchingNameColumnWidth) + nameColumn.Width = adjustedNameColumnWidth; + } } }; } From 39efc1c36305e3ab9f47db70ffd114c40a49c29e Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 23 Sep 2009 15:38:53 +0000 Subject: [PATCH 05/13] Fixed NRefactory C# parser bug with method calls on InnerClassTypeReferences ("A.B.C.Foo();") git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4986 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Parser/CSharp/CSharpParser.cs | 5 +- .../Expressions/InvocationExpressionTests.cs | 84 +++++++++++++++++++ 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs index fd3adc8edf..405a1cc22b 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs @@ -551,8 +551,9 @@ namespace ICSharpCode.NRefactory.Parser.CSharp TypeReference targetType = GetTypeReferenceFromExpression(member.TargetObject); if (targetType != null) { if (targetType.GenericTypes.Count == 0 && targetType.IsArrayType == false) { - TypeReference tr = new TypeReference(targetType.Type + "." + member.MemberName, member.TypeArguments); - tr.IsGlobal = targetType.IsGlobal; + TypeReference tr = targetType.Clone(); + tr.Type = tr.Type + "." + member.MemberName; + tr.GenericTypes.AddRange(member.TypeArguments); return tr; } else { return new InnerClassTypeReference(targetType, member.MemberName, member.TypeArguments); diff --git a/src/Libraries/NRefactory/Test/Parser/Expressions/InvocationExpressionTests.cs b/src/Libraries/NRefactory/Test/Parser/Expressions/InvocationExpressionTests.cs index 87f3560d24..043a3d0ae2 100644 --- a/src/Libraries/NRefactory/Test/Parser/Expressions/InvocationExpressionTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/Expressions/InvocationExpressionTests.cs @@ -117,6 +117,47 @@ namespace ICSharpCode.NRefactory.Tests.Ast Assert.AreEqual(new Location(4, 1), mre.TargetObject.StartLocation); Assert.AreEqual(new Location(6, 1), mre.TargetObject.EndLocation); } + + [Test] + public void InvocationOnGenericType() + { + InvocationExpression expr = ParseUtilCSharp.ParseExpression("A.Foo()"); + MemberReferenceExpression mre = (MemberReferenceExpression)expr.TargetObject; + Assert.AreEqual("Foo", mre.MemberName); + TypeReferenceExpression tre = (TypeReferenceExpression)mre.TargetObject; + Assert.AreEqual("A", tre.TypeReference.Type); + Assert.AreEqual("T", tre.TypeReference.GenericTypes[0].Type); + } + + [Test] + public void InvocationOnInnerClassInGenericType() + { + InvocationExpression expr = ParseUtilCSharp.ParseExpression("A.B.Foo()"); + MemberReferenceExpression mre = (MemberReferenceExpression)expr.TargetObject; + Assert.AreEqual("Foo", mre.MemberName); + MemberReferenceExpression mre2 = (MemberReferenceExpression)mre.TargetObject; + Assert.AreEqual("B", mre2.MemberName); + TypeReferenceExpression tre = (TypeReferenceExpression)mre2.TargetObject; + Assert.AreEqual("A", tre.TypeReference.Type); + Assert.AreEqual("T", tre.TypeReference.GenericTypes[0].Type); + } + + [Test] + public void InvocationOnGenericInnerClassInGenericType() + { + InvocationExpression expr = ParseUtilCSharp.ParseExpression("A.B.C.Foo()"); + MemberReferenceExpression mre = (MemberReferenceExpression)expr.TargetObject; + Assert.AreEqual("Foo", mre.MemberName); + TypeReferenceExpression tre = (TypeReferenceExpression)mre.TargetObject; + InnerClassTypeReference ictr = (InnerClassTypeReference)tre.TypeReference; + Assert.AreEqual("B.C", ictr.Type); + Assert.AreEqual(1, ictr.GenericTypes.Count); + Assert.AreEqual("U", ictr.GenericTypes[0].Type); + + Assert.AreEqual("A", ictr.BaseType.Type); + Assert.AreEqual(1, ictr.BaseType.GenericTypes.Count); + Assert.AreEqual("T", ictr.BaseType.GenericTypes[0].Type); + } #endregion #region VB.NET @@ -145,6 +186,49 @@ namespace ICSharpCode.NRefactory.Tests.Ast Assert.AreEqual(0, ie.Arguments.Count); } + [Test] + public void VBInvocationOnGenericType() + { + InvocationExpression expr = ParseUtilVBNet.ParseExpression("A(Of T).Foo()"); + MemberReferenceExpression mre = (MemberReferenceExpression)expr.TargetObject; + Assert.AreEqual("Foo", mre.MemberName); + IdentifierExpression tre = (IdentifierExpression)mre.TargetObject; + Assert.AreEqual("A", tre.Identifier); + Assert.AreEqual("T", tre.TypeArguments[0].Type); + } + + [Test] + public void VBInvocationOnInnerClassInGenericType() + { + InvocationExpression expr = ParseUtilVBNet.ParseExpression("A(Of T).B.Foo()"); + MemberReferenceExpression mre = (MemberReferenceExpression)expr.TargetObject; + Assert.AreEqual("Foo", mre.MemberName); + MemberReferenceExpression mre2 = (MemberReferenceExpression)mre.TargetObject; + Assert.AreEqual("B", mre2.MemberName); + IdentifierExpression tre = (IdentifierExpression)mre2.TargetObject; + Assert.AreEqual("A", tre.Identifier); + Assert.AreEqual("T", tre.TypeArguments[0].Type); + } + + [Test] + public void VBInvocationOnGenericInnerClassInGenericType() + { + InvocationExpression expr = ParseUtilVBNet.ParseExpression("A(Of T).B.C(Of U).Foo()"); + MemberReferenceExpression mre = (MemberReferenceExpression)expr.TargetObject; + Assert.AreEqual("Foo", mre.MemberName); + + MemberReferenceExpression mre2 = (MemberReferenceExpression)mre.TargetObject; + Assert.AreEqual("C", mre2.MemberName); + Assert.AreEqual("U", mre2.TypeArguments[0].Type); + + MemberReferenceExpression mre3 = (MemberReferenceExpression)mre2.TargetObject; + Assert.AreEqual("B", mre3.MemberName); + + IdentifierExpression tre = (IdentifierExpression)mre3.TargetObject; + Assert.AreEqual("A", tre.Identifier); + Assert.AreEqual("T", tre.TypeArguments[0].Type); + } + #endregion } } From 2d46880b726baeeb53a817d0b044a77fa36851b2 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 25 Sep 2009 19:28:27 +0000 Subject: [PATCH 06/13] Fixed ambience NullReferenceException (bug introduced in revision 4954) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4993 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/CSharp/CSharpAmbience.cs | 2 ++ .../Project/Src/VBNet/VBNetAmbience.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/CSharpAmbience.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/CSharpAmbience.cs index 8b6c30ab79..d295c7f050 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/CSharpAmbience.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/CSharpAmbience.cs @@ -534,6 +534,8 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp static IReturnType GetElementType(IReturnType potentialArrayType) { + if (potentialArrayType == null) + return null; ArrayReturnType result; while ((result = potentialArrayType.CastToArrayReturnType()) != null) { potentialArrayType = result.ArrayElementType; diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetAmbience.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetAmbience.cs index b5502c139d..0fc70994e9 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetAmbience.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetAmbience.cs @@ -552,6 +552,8 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet static IReturnType GetElementType(IReturnType potentialArrayType) { + if (potentialArrayType == null) + return null; ArrayReturnType result; while ((result = potentialArrayType.CastToArrayReturnType()) != null) { potentialArrayType = result.ArrayElementType; From 59eb977b8ae18aff928d877f409ba9d463cf9c69 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 26 Sep 2009 10:12:59 +0000 Subject: [PATCH 07/13] Text editor indent settings now used when generating event handlers in Python forms designer. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@5000 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/PythonDesignerGenerator.cs | 7 +- .../InsertEventHandlerTestFixtureBase.cs | 4 +- ...tEventHandlerWithSpaceIndentTestFixture.cs | 65 +++++++++++++++++++ .../Test/PythonBinding.Tests.csproj | 1 + 4 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/InsertEventHandlerWithSpaceIndentTestFixture.cs diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerGenerator.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerGenerator.cs index e3ebed2942..ffaa639da5 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerGenerator.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerGenerator.cs @@ -132,7 +132,7 @@ namespace ICSharpCode.PythonBinding // Insert the event handler at the end of the class with an extra // new line before it. IDocument doc = viewContent.DesignerCodeFileDocument; - string eventHandler = CreateEventHandler(eventMethodName, body, "\t"); + string eventHandler = CreateEventHandler(eventMethodName, body, NRefactoryToPythonConverter.GetIndentString(textEditorProperties)); int line = doc.LineSegmentCollection.Count; LineSegment lastLineSegment = doc.GetLineSegment(line - 1); int offset = lastLineSegment.Offset + lastLineSegment.Length; @@ -229,6 +229,7 @@ namespace ICSharpCode.PythonBinding ///

/// Returns the generated event handler. /// + /// The indent string to use for the event handler. protected string CreateEventHandler(string eventMethodName, string body, string indentation) { if (String.IsNullOrEmpty(body)) { @@ -241,9 +242,9 @@ namespace ICSharpCode.PythonBinding eventHandler.Append("def "); eventHandler.Append(eventMethodName); eventHandler.Append("(self, sender, e):"); - eventHandler.AppendLine(); + eventHandler.AppendLine(); eventHandler.Append(indentation); - eventHandler.Append("\t"); + eventHandler.Append(NRefactoryToPythonConverter.GetIndentString(textEditorProperties)); eventHandler.Append(body); return eventHandler.ToString(); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/InsertEventHandlerTestFixtureBase.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/InsertEventHandlerTestFixtureBase.cs index e94e73a310..431477ac55 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/InsertEventHandlerTestFixtureBase.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/InsertEventHandlerTestFixtureBase.cs @@ -26,11 +26,13 @@ namespace PythonBinding.Tests.Designer protected DerivedFormDesignerViewContent viewContent; protected string fileName = @"C:\Projects\Python\mainform.py"; protected DerivedPythonDesignerGenerator generator; + protected MockTextEditorProperties textEditorProperties; [TestFixtureSetUp] public void SetUpFixture() { - generator = new DerivedPythonDesignerGenerator(); + textEditorProperties = new MockTextEditorProperties(); + generator = new DerivedPythonDesignerGenerator(textEditorProperties); mockViewContent = new MockTextEditorViewContent(); viewContent = new DerivedFormDesignerViewContent(mockViewContent, new MockOpenedFile(fileName)); generator.Attach(viewContent); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/InsertEventHandlerWithSpaceIndentTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/InsertEventHandlerWithSpaceIndentTestFixture.cs new file mode 100644 index 0000000000..57c603284d --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/InsertEventHandlerWithSpaceIndentTestFixture.cs @@ -0,0 +1,65 @@ +// +// +// +// +// $Revision$ +// + +using System; +using ICSharpCode.PythonBinding; +using ICSharpCode.FormsDesigner; +using ICSharpCode.SharpDevelop.Dom; +using NUnit.Framework; +using PythonBinding.Tests.Utils; + +namespace PythonBinding.Tests.Designer +{ + /// + /// Tests the PythonDesignerGenerator uses the text editor properties for indentation when + /// inserting an event handler into the document. + /// + [TestFixture] + public class InsertEventHandlerWithSpaceIndentTestFixture : InsertEventHandlerTestFixtureBase + { + public override void AfterSetUpFixture() + { + textEditorProperties.ConvertTabsToSpaces = true; + textEditorProperties.IndentationSize = 4; + MockEventDescriptor mockEventDescriptor = new MockEventDescriptor("Click"); + insertedEventHandler = generator.InsertComponentEvent(null, mockEventDescriptor, "button1_click", String.Empty, out file, out position); + } + + [Test] + public void ExpectedCodeAfterEventHandlerInserted() + { + string expectedCode = GetTextEditorCode(); + string eventHandler = " def button1_click(self, sender, e):\r\n" + + " pass"; + expectedCode = expectedCode + "\r\n" + eventHandler; + + Assert.AreEqual(expectedCode, viewContent.DesignerCodeFileContent); + } + + /// + /// Note that the text editor code already has the + /// statement: + /// + /// "self._button1.Click += button1_click" + /// + /// This is generated by the form designer framework and not + /// by the designer generator. + /// + protected override string GetTextEditorCode() + { + return "from System.Windows.Forms import Form\r\n" + + "\r\n" + + "class MainForm(Form):\r\n" + + " def __init__(self):\r\n" + + " self.InitializeComponents()\r\n" + + " \r\n" + + " def InitializeComponents(self):\r\n" + + " self._button1 = System.Windows.Forms.Button()\r\n" + + " self.Controls.Add(self._button1)\r\n"; + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj index de16d4dc5d..cbba547df8 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj @@ -232,6 +232,7 @@ + From cc0f7f60e72ec4e37780b8c9ae05cee1521e2b94 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 26 Sep 2009 12:34:07 +0000 Subject: [PATCH 08/13] Fix bug in "AddUsingDeclaration" refactoring: when running the refactoring two times quickly after another (without waiting for a reparse), the list of using declarations would get corrupted. Use correct sorting logic for inserting using declarations. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@5001 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../NamespaceRefactoringService.cs | 17 +++++++++++++---- .../RefactoringMenuBuilder.cs | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/NamespaceRefactoringService.cs b/src/Main/Base/Project/Src/Services/RefactoringService/NamespaceRefactoringService.cs index 716ea03db1..7b9b7e7249 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/NamespaceRefactoringService.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/NamespaceRefactoringService.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring } else if (!IsSystemNamespace(u1) && IsSystemNamespace(u2)) { return 1; } - return a.Usings[0].CompareTo(b.Usings[0]); + return u1.CompareTo(u2); } if (a.Aliases.Count != 0 && b.Aliases.Count != 0) { return a.Aliases.Keys.First().CompareTo(b.Aliases.Keys.First()); @@ -95,6 +95,17 @@ namespace ICSharpCode.SharpDevelop.Refactoring public static void AddUsingDeclaration(ICompilationUnit cu, IDocument document, string newNamespace, bool sortExistingUsings) { + if (cu == null) + throw new ArgumentNullException("cu"); + if (document == null) + throw new ArgumentNullException("document"); + if (newNamespace == null) + throw new ArgumentNullException("newNamespace"); + + ParseInformation info = ParserService.ParseFile(cu.FileName, document.TextContent); + if (info != null) + cu = info.MostRecentCompilationUnit; + IUsing newUsingDecl = new DefaultUsing(cu.ProjectContent); newUsingDecl.Usings.Add(newNamespace); @@ -104,9 +115,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring } bool inserted = false; for (int i = 0; i < newUsings.Count; i++) { - if (newUsings[i].Usings.Count >= 1 - && cu.ProjectContent.Language.NameComparer.Compare(newNamespace, newUsings[i].Usings[0]) <= 0) - { + if (CompareUsings(newUsingDecl, newUsings[i]) <= 0) { newUsings.Insert(i, newUsingDecl); inserted = true; break; diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs index 6f4caf2db1..011e9eec32 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs @@ -188,6 +188,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring item.DropDownItems.Add(subItem); subItem.Click += delegate { NamespaceRefactoringService.AddUsingDeclaration(callingClass.CompilationUnit, textArea.Document, newNamespace, true); + ParserService.StartAsyncParse(callingClass.CompilationUnit.FileName, textArea.Document.TextContent); textArea.MotherTextEditorControl.Refresh(); }; } From 503cb2b06ec314945ab75b4a57fc65b915897da4 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 26 Sep 2009 14:48:23 +0000 Subject: [PATCH 09/13] Improved code completion with default constructors: - don't add default constructor when a class has internal constructors - always add default constructor to value types Disable "Rename" command for operators. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@5002 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/CodeCompletion/ResolveVisitor.cs | 5 +- .../Commands/ClassMemberMenuBuilder.cs | 2 +- .../MethodInsightDataProvider.cs | 5 -- .../Base/Test/GenerateOverrideMethodTests.cs | 7 ++- src/Main/Base/Test/NRefactoryResolverTests.cs | 39 ++++++++++++ src/Main/Base/Test/ReflectionLayerTests.cs | 16 +++++ .../Project/Src/CecilReader.cs | 1 + .../Src/Implementations/CompoundClass.cs | 2 + .../Src/Implementations/DefaultClass.cs | 28 ++++++--- .../Src/Implementations/DefaultMethod.cs | 9 ++- .../Src/Implementations/DefaultReturnType.cs | 10 +++ .../Project/Src/Interfaces/IClass.cs | 26 ++++++++ .../Src/NRefactoryResolver/ResolveVisitor.cs | 5 -- .../Src/ReflectionLayer/DomPersistence.cs | 6 +- .../Src/ReflectionLayer/ReflectionClass.cs | 1 + .../NRefactoryAstConverterTests.cs | 63 +++++++++++++++++++ 16 files changed, 196 insertions(+), 29 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs index d1432e9198..76bafc318f 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs @@ -418,16 +418,13 @@ namespace Grunwald.BooBinding.CodeCompletion if (callingClass != null) isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(trr.ResolvedClass); - foreach (IMethod m in trr.ResolvedClass.Methods) { + foreach (IMethod m in trr.ResolvedClass.DefaultReturnType.GetMethods()) { if (m.IsConstructor && !m.IsStatic && m.IsAccessible(callingClass, isClassInInheritanceTree)) { methods.Add(m); } } - if (methods.Count == 0) { - methods.Add(ICSharpCode.SharpDevelop.Dom.Constructor.CreateDefault(trr.ResolvedClass)); - } ResolveInvocation(methods, node.Arguments); if (resolveResult != null) resolveResult.ResolvedType = trr.ResolvedType; diff --git a/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs b/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs index c5b76b5b81..09b3e7fc88 100644 --- a/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs +++ b/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs @@ -45,7 +45,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands member.DeclaringType.ProjectContent.Language.CodeGenerator != null && !FindReferencesAndRenameHelper.IsReadOnly(member.DeclaringType); - if (method == null || !method.IsConstructor) { + if (method == null || !method.IsConstructor && !method.GetIsOperator()) { if (!FindReferencesAndRenameHelper.IsReadOnly(member.DeclaringType) && !(member is IProperty && ((IProperty)member).IsIndexer)) { cmd = new MenuCommand("${res:SharpDevelop.Refactoring.RenameCommand}", Rename); diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs index 45798339a5..16f43d64ec 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs @@ -144,11 +144,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor if (trr != null || expressionResult.Context == ExpressionContext.BaseConstructorCall) { if (results.ResolvedType != null) { methods.AddRange(GetConstructorMethods(results.ResolvedType.GetMethods())); - IClass resolvedClass = (trr != null) ? trr.ResolvedClass : results.ResolvedType.GetUnderlyingClass(); - if (methods.Count == 0 && resolvedClass != null && !resolvedClass.IsStatic) { - // add default constructor - methods.Add(Constructor.CreateDefault(resolvedClass)); - } } } } else { diff --git a/src/Main/Base/Test/GenerateOverrideMethodTests.cs b/src/Main/Base/Test/GenerateOverrideMethodTests.cs index b6a990dff8..ef8e594cdb 100644 --- a/src/Main/Base/Test/GenerateOverrideMethodTests.cs +++ b/src/Main/Base/Test/GenerateOverrideMethodTests.cs @@ -6,6 +6,7 @@ // using System; +using System.Linq; using ICSharpCode.NRefactory.Ast; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom.Refactoring; @@ -28,10 +29,10 @@ namespace ICSharpCode.SharpDevelop.Tests Assert.AreEqual(2, cu.Classes.Count); Assert.AreEqual(1, cu.Classes[0].Methods.Count + cu.Classes[0].Properties.Count); IMember virtualMember; - if (cu.Classes[0].Methods.Count > 0) - virtualMember = cu.Classes[0].Methods[0]; - else //if (cu.Classes[0].Properties.Count > 0) + if (cu.Classes[0].Properties.Count > 0) virtualMember = cu.Classes[0].Properties[0]; + else + virtualMember = cu.Classes[0].Methods[0]; CSharpCodeGenerator ccg = new CSharpCodeGenerator(); AttributedNode result = ccg.GetOverridingMethod(virtualMember, new ClassFinder(cu.Classes[1], 3, 1)); Assert.IsNotNull(result); diff --git a/src/Main/Base/Test/NRefactoryResolverTests.cs b/src/Main/Base/Test/NRefactoryResolverTests.cs index 75dd5a0c7e..14b49bfbb5 100644 --- a/src/Main/Base/Test/NRefactoryResolverTests.cs +++ b/src/Main/Base/Test/NRefactoryResolverTests.cs @@ -578,11 +578,50 @@ class A { IMethod m = (IMethod)result.ResolvedMember; Assert.IsNotNull(m); Assert.AreEqual("A", result.ResolvedType.FullyQualifiedName); + Assert.AreEqual(0, m.Parameters.Count); ArrayList ar = result.GetCompletionData(result.CallingClass.ProjectContent); Assert.IsTrue(ContainsMember(ar, "A.Method")); } + [Test] + public void DefaultStructCTorOverloadLookupTest() + { + string program = @"struct A { + void Method() { + + } + + public A(int x) {} +} +"; + MemberResolveResult result = Resolve(program, "new A()", 3); + IMethod m = (IMethod)result.ResolvedMember; + Assert.IsNotNull(m); + Assert.AreEqual("A", result.ResolvedType.FullyQualifiedName); + Assert.AreEqual(0, m.Parameters.Count); + + ArrayList ar = result.GetCompletionData(result.CallingClass.ProjectContent); + Assert.IsTrue(ContainsMember(ar, "A.Method")); + } + + [Test] + public void ReflectionStructCTorOverloadLookupTest() + { + string program = @"using System; +class A { + void Method() { + + } +} +"; + MemberResolveResult result = Resolve(program, "new DateTime()", 4); + IMethod m = (IMethod)result.ResolvedMember; + Assert.IsNotNull(m); + Assert.AreEqual("System.DateTime", result.ResolvedType.FullyQualifiedName); + Assert.AreEqual(0, m.Parameters.Count); + } + [Test] public void ValueInsideSetterTest() { diff --git a/src/Main/Base/Test/ReflectionLayerTests.cs b/src/Main/Base/Test/ReflectionLayerTests.cs index 78b0322350..d3f0609b53 100644 --- a/src/Main/Base/Test/ReflectionLayerTests.cs +++ b/src/Main/Base/Test/ReflectionLayerTests.cs @@ -171,6 +171,22 @@ namespace ICSharpCode.SharpDevelop.Tests Assert.AreEqual("System.Void", prt.BaseType.FullyQualifiedName); } + [Test] + public void DateTimeDefaultConstructor() + { + IClass c = mscorlib.GetClass("System.DateTime", 0); + Assert.IsFalse(c.Methods.Any(p => p.IsConstructor && p.Parameters.Count == 0)); + Assert.IsTrue(c.GetAddDefaultConstructorIfRequired()); + } + + [Test] + public void NoEncodingInfoDefaultConstructor() + { + IClass c = mscorlib.GetClass("System.Text.EncodingInfo", 0); + Assert.IsFalse(c.Methods.Any(p => p.IsConstructor)); // EncodingInfo only has an internal constructor + Assert.IsFalse(c.GetAddDefaultConstructorIfRequired()); + } + [Test] public void ParameterComparisonTest() { diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs index 41d2e73566..01e54df0e3 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs @@ -324,6 +324,7 @@ namespace ICSharpCode.SharpDevelop.Dom foreach (MethodDefinition method in type.Constructors) { AddMethod(method); } + this.AddDefaultConstructorIfRequired = (this.ClassType == ClassType.Struct || this.ClassType == ClassType.Enum); foreach (MethodDefinition method in type.Methods) { if (!method.IsSpecialName) { AddMethod(method); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/CompoundClass.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/CompoundClass.cs index bb9db4fab9..5e44a5bfdb 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/CompoundClass.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/CompoundClass.cs @@ -107,6 +107,8 @@ namespace ICSharpCode.SharpDevelop.Dom this.Properties.AddRange(part.Properties); this.Events.AddRange(part.Events); this.Fields.AddRange(part.Fields); + + this.AddDefaultConstructorIfRequired |= part.GetAddDefaultConstructorIfRequired(); } this.CompilationUnit.FileName = shortestFileName; if ((modifier & ModifierEnum.VisibilityMask) == ModifierEnum.None) { diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs index 9ef5cd6ee5..770147537b 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs @@ -12,7 +12,7 @@ using System.Threading; namespace ICSharpCode.SharpDevelop.Dom { - public class DefaultClass : AbstractEntity, IClass, IComparable + public class DefaultClass : AbstractEntity, IClass2, IComparable { ClassType classType; DomRegion region; @@ -64,13 +64,16 @@ namespace ICSharpCode.SharpDevelop.Dom } */ - byte flags; + byte flags = addDefaultConstructorIfRequiredFlag; + const byte calculatedFlagsReady = 0x01; const byte hasPublicOrInternalStaticMembersFlag = 0x02; const byte hasExtensionMethodsFlag = 0x04; - internal byte Flags { + const byte addDefaultConstructorIfRequiredFlag = 0x08; + + internal byte CalculatedFlags { get { - if (flags == 0) { - flags = 1; + if ((flags & calculatedFlagsReady) == 0) { + flags |= calculatedFlagsReady; foreach (IMember m in this.Fields) { if (m.IsStatic && (m.IsPublic || m.IsInternal)) { flags |= hasPublicOrInternalStaticMembersFlag; @@ -112,12 +115,23 @@ namespace ICSharpCode.SharpDevelop.Dom } public bool HasPublicOrInternalStaticMembers { get { - return (Flags & hasPublicOrInternalStaticMembersFlag) == hasPublicOrInternalStaticMembersFlag; + return (CalculatedFlags & hasPublicOrInternalStaticMembersFlag) == hasPublicOrInternalStaticMembersFlag; } } public bool HasExtensionMethods { get { - return (Flags & hasExtensionMethodsFlag) == hasExtensionMethodsFlag; + return (CalculatedFlags & hasExtensionMethodsFlag) == hasExtensionMethodsFlag; + } + } + public bool AddDefaultConstructorIfRequired { + get { + return (flags & addDefaultConstructorIfRequiredFlag) == addDefaultConstructorIfRequiredFlag; + } + set { + if (value) + flags |= addDefaultConstructorIfRequiredFlag; + else + flags &= unchecked((byte)~addDefaultConstructorIfRequiredFlag); } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultMethod.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultMethod.cs index a1385815e9..e966822fa6 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultMethod.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultMethod.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; namespace ICSharpCode.SharpDevelop.Dom @@ -36,7 +37,13 @@ namespace ICSharpCode.SharpDevelop.Dom if (c == null) throw new ArgumentNullException("c"); - Constructor con = new Constructor(ModifierEnum.Public, c.Region, c.Region, c); + ModifierEnum modifiers = ModifierEnum.Synthetic; + if (c.IsAbstract) + modifiers |= ModifierEnum.Protected; + else + modifiers |= ModifierEnum.Public; + DomRegion region = new DomRegion(c.Region.BeginLine, c.Region.BeginColumn, c.Region.BeginLine, c.Region.BeginColumn); + Constructor con = new Constructor(modifiers, region, region, c); con.Documentation = "Default constructor of " + c.Name; return con; } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultReturnType.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultReturnType.cs index e9c8442a79..ce8709545a 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultReturnType.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultReturnType.cs @@ -81,6 +81,16 @@ namespace ICSharpCode.SharpDevelop.Dom using (var busyLock = busyManager.Enter(this)) { if (busyLock.Success) { l.AddRange(c.Methods); + if (c.GetAddDefaultConstructorIfRequired() && !c.IsStatic) { + // A constructor is added for classes that do not have a default constructor; + // and for all structs. + if (c.ClassType == ClassType.Class && !l.Exists(m => m.IsConstructor)) { + l.Add(Constructor.CreateDefault(c)); + } else if (c.ClassType == ClassType.Struct || c.ClassType == ClassType.Enum) { + l.Add(Constructor.CreateDefault(c)); + } + } + if (c.ClassType == ClassType.Interface) { if (c.BaseTypes.Count == 0) { AddMethodsFromBaseType(l, c.ProjectContent.SystemTypes.Object); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IClass.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IClass.cs index 7430d2c76b..0d6a762508 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IClass.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IClass.cs @@ -151,4 +151,30 @@ namespace ICSharpCode.SharpDevelop.Dom ///// //IClass Unfreeze(); } + + public interface IClass2 : IClass + { + /// + /// Gets whether a default constructor should be added to this class if it is required. + /// Such automatic default constructors will not appear in IClass.Methods, but will be present + /// in IClass.DefaultReturnType.GetMethods(). + /// + /// This way of creating the default constructor is necessary because + /// we cannot create it directly in the IClass - we need to consider partial classes. + bool AddDefaultConstructorIfRequired { + get; + } + } + + public static class Class2Compatibility + { + public static bool GetAddDefaultConstructorIfRequired(this IClass c) + { + IClass2 c2 = c as IClass2; + if (c2 != null) + return c2.AddDefaultConstructorIfRequired; + else + return false; + } + } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs index f85efb3821..a51d1eef59 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs @@ -444,11 +444,6 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver bool resultIsAcceptable; IMethod result = MemberLookupHelper.FindOverload(methods, argumentTypes, out resultIsAcceptable); - if (result == null) { - IClass c = rt.GetUnderlyingClass(); - if (c != null) - result = Constructor.CreateDefault(c); - } ResolveResult rr = CreateMemberResolveResult(result); if (rr != null) rr.ResolvedType = rt; diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/DomPersistence.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/DomPersistence.cs index 5ce179a497..3dcdaad875 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/DomPersistence.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/DomPersistence.cs @@ -20,7 +20,7 @@ namespace ICSharpCode.SharpDevelop.Dom { public const long FileMagic = 0x11635233ED2F428C; public const long IndexFileMagic = 0x11635233ED2F427D; - public const short FileVersion = 24; + public const short FileVersion = 25; ProjectContentRegistry registry; string cacheDirectory; @@ -384,7 +384,7 @@ namespace ICSharpCode.SharpDevelop.Dom } writer.Write((int)c.Modifiers); if (c is DefaultClass) { - writer.Write(((DefaultClass)c).Flags); + writer.Write(((DefaultClass)c).CalculatedFlags); } else { writer.Write((byte)0); } @@ -453,7 +453,7 @@ namespace ICSharpCode.SharpDevelop.Dom c.BaseTypes.Add(ReadType()); } c.Modifiers = (ModifierEnum)reader.ReadInt32(); - c.Flags = reader.ReadByte(); + c.CalculatedFlags = reader.ReadByte(); c.ClassType = (ClassType)reader.ReadByte(); ReadAttributes(c); count = reader.ReadInt32(); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionClass.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionClass.cs index 1cd06d01d3..dff9d6ba6b 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionClass.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionClass.cs @@ -55,6 +55,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer Methods.Add(new ReflectionMethod(methodInfo, this)); } } + this.AddDefaultConstructorIfRequired = (this.ClassType == ClassType.Struct || this.ClassType == ClassType.Enum); foreach (EventInfo eventInfo in type.GetEvents(flags)) { Events.Add(new ReflectionEvent(eventInfo, this)); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/NRefactoryAstConverterTests.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/NRefactoryAstConverterTests.cs index e720318568..da9c1a5ad8 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/NRefactoryAstConverterTests.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/NRefactoryAstConverterTests.cs @@ -6,6 +6,7 @@ // using System; +using System.Collections.Generic; using System.Linq; using System.IO; using ICSharpCode.NRefactory; @@ -242,5 +243,67 @@ class Outer where T1 : IDisposable { Assert.AreSame(inner.TypeParameters[1], method.TypeParameters[0].Constraints[0].CastToGenericReturnType().TypeParameter); } + + [Test] + public void DefaultConstructorTest() + { + ICompilationUnit cu = Parse("class X { }", SupportedLanguage.CSharp, true); + + Assert.AreEqual(0, cu.Classes[0].Methods.Count); + + IMethod ctor = cu.Classes[0].DefaultReturnType.GetMethods().Single(m => m.IsConstructor); + Assert.AreEqual(ModifierEnum.Public | ModifierEnum.Synthetic, ctor.Modifiers); + Assert.AreEqual(0, ctor.Parameters.Count); + } + + [Test] + public void DefaultConstructorOnAbstractClassTest() + { + ICompilationUnit cu = Parse("abstract class X { }", SupportedLanguage.CSharp, true); + + Assert.AreEqual(0, cu.Classes[0].Methods.Count); + + IMethod ctor = cu.Classes[0].DefaultReturnType.GetMethods().Single(m => m.IsConstructor); + Assert.AreEqual(ModifierEnum.Protected | ModifierEnum.Synthetic, ctor.Modifiers); + Assert.AreEqual(0, ctor.Parameters.Count); + } + + [Test] + public void NoDefaultConstructorWithExplicitConstructorTest() + { + ICompilationUnit cu = Parse("class X { private X(int a) {} }", SupportedLanguage.CSharp, true); + + Assert.AreEqual(1, cu.Classes[0].Methods.Count); + + IMethod ctor = cu.Classes[0].DefaultReturnType.GetMethods().Single(m => m.IsConstructor); + Assert.AreEqual(ModifierEnum.Private, ctor.Modifiers); + Assert.AreEqual(1, ctor.Parameters.Count); + } + + [Test] + public void DefaultConstructorWithExplicitConstructorOnStructTest() + { + ICompilationUnit cu = Parse("struct X { private X(int a) {} }", SupportedLanguage.CSharp, true); + + Assert.AreEqual(1, cu.Classes[0].Methods.Count); + + List ctors = cu.Classes[0].DefaultReturnType.GetMethods().FindAll(m => m.IsConstructor); + Assert.AreEqual(2, ctors.Count); + + Assert.AreEqual(ModifierEnum.Private, ctors[0].Modifiers); + Assert.AreEqual(1, ctors[0].Parameters.Count); + + Assert.AreEqual(ModifierEnum.Public | ModifierEnum.Synthetic, ctors[1].Modifiers); + Assert.AreEqual(0, ctors[1].Parameters.Count); + } + + [Test] + public void NoDefaultConstructorOnStaticClassTest() + { + ICompilationUnit cu = Parse("static class X { }", SupportedLanguage.CSharp, true); + + Assert.AreEqual(0, cu.Classes[0].Methods.Count); + Assert.IsFalse(cu.Classes[0].DefaultReturnType.GetMethods().Any(m => m.IsConstructor)); + } } } From 93c1198fd477ab2358e7a8f6f495eb5058603fb4 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 26 Sep 2009 15:34:45 +0000 Subject: [PATCH 10/13] NRefactory C# parser: fixed parse error for unknown attribute targets - the C# compiler only emits a warning for those git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@5003 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Parser/CSharp/CSharpParser.cs | 4 +- .../Project/Src/Parser/CSharp/Parser.cs | 2245 ++++++++--------- .../Project/Src/Parser/CSharp/cs.ATG | 7 +- .../GlobalScope/TypeDeclarationTests.cs | 22 + 4 files changed, 1144 insertions(+), 1134 deletions(-) diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs index 405a1cc22b..48588637d3 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs @@ -503,9 +503,7 @@ namespace ICSharpCode.NRefactory.Parser.CSharp string val = la.val; return (cur == Tokens.Event || cur == Tokens.Return || - (Tokens.IdentifierTokens[cur] && - (val == "field" || val == "method" || val == "module" || - val == "param" || val == "property" || val == "type"))) && + Tokens.IdentifierTokens[cur]) && Peek(1).kind == Tokens.Colon; } diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs index 933d98504f..3c78839d1b 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs @@ -56,23 +56,23 @@ IsGlobalAttrTarget()) { void ExternAliasDirective() { -#line 350 "cs.ATG" +#line 345 "cs.ATG" ExternAliasDirective ead = new ExternAliasDirective { StartLocation = la.Location }; Expect(71); Identifier(); -#line 353 "cs.ATG" +#line 348 "cs.ATG" if (t.val != "alias") Error("Expected 'extern alias'."); Identifier(); -#line 354 "cs.ATG" +#line 349 "cs.ATG" ead.Name = t.val; Expect(11); -#line 355 "cs.ATG" +#line 350 "cs.ATG" ead.EndLocation = t.EndLocation; -#line 356 "cs.ATG" +#line 351 "cs.ATG" compilationUnit.AddChild(ead); } @@ -160,7 +160,7 @@ out attribute); void NamespaceMemberDecl() { -#line 323 "cs.ATG" +#line 318 "cs.ATG" AttributeSection section; List attributes = new List(); ModifierList m = new ModifierList(); @@ -169,13 +169,13 @@ out attribute); if (la.kind == 88) { lexer.NextToken(); -#line 329 "cs.ATG" +#line 324 "cs.ATG" Location startPos = t.Location; Qualident( -#line 330 "cs.ATG" +#line 325 "cs.ATG" out qualident); -#line 330 "cs.ATG" +#line 325 "cs.ATG" INode node = new NamespaceDeclaration(qualident); node.StartLocation = startPos; compilationUnit.AddChild(node); @@ -196,58 +196,58 @@ out qualident); lexer.NextToken(); } -#line 340 "cs.ATG" +#line 335 "cs.ATG" node.EndLocation = t.EndLocation; compilationUnit.BlockEnd(); } else if (StartOf(2)) { while (la.kind == 18) { AttributeSection( -#line 344 "cs.ATG" +#line 339 "cs.ATG" out section); -#line 344 "cs.ATG" +#line 339 "cs.ATG" attributes.Add(section); } while (StartOf(3)) { TypeModifier( -#line 345 "cs.ATG" +#line 340 "cs.ATG" m); } TypeDecl( -#line 346 "cs.ATG" +#line 341 "cs.ATG" m, attributes); } else SynErr(146); } void Qualident( -#line 480 "cs.ATG" +#line 475 "cs.ATG" out string qualident) { Identifier(); -#line 482 "cs.ATG" +#line 477 "cs.ATG" qualidentBuilder.Length = 0; qualidentBuilder.Append(t.val); while ( -#line 483 "cs.ATG" +#line 478 "cs.ATG" DotAndIdent()) { Expect(15); Identifier(); -#line 483 "cs.ATG" +#line 478 "cs.ATG" qualidentBuilder.Append('.'); qualidentBuilder.Append(t.val); } -#line 486 "cs.ATG" +#line 481 "cs.ATG" qualident = qualidentBuilder.ToString(); } void NonArrayType( -#line 598 "cs.ATG" +#line 593 "cs.ATG" out TypeReference type) { -#line 600 "cs.ATG" +#line 595 "cs.ATG" Location startPos = la.Location; string name; int pointer = 0; @@ -255,37 +255,37 @@ out TypeReference type) { if (StartOf(4)) { ClassType( -#line 606 "cs.ATG" +#line 601 "cs.ATG" out type, false); } else if (StartOf(5)) { SimpleType( -#line 607 "cs.ATG" +#line 602 "cs.ATG" out name); -#line 607 "cs.ATG" +#line 602 "cs.ATG" type = new TypeReference(name, true); } else if (la.kind == 123) { lexer.NextToken(); Expect(6); -#line 608 "cs.ATG" +#line 603 "cs.ATG" pointer = 1; type = new TypeReference("System.Void", true); } else SynErr(147); if (la.kind == 12) { NullableQuestionMark( -#line 611 "cs.ATG" +#line 606 "cs.ATG" ref type); } while ( -#line 613 "cs.ATG" +#line 608 "cs.ATG" IsPointer()) { Expect(6); -#line 614 "cs.ATG" +#line 609 "cs.ATG" ++pointer; } -#line 616 "cs.ATG" +#line 611 "cs.ATG" if (type != null) { type.PointerNestingLevel = pointer; type.EndLocation = t.EndLocation; @@ -487,68 +487,68 @@ out expr); } void Expr( -#line 1768 "cs.ATG" +#line 1763 "cs.ATG" out Expression expr) { -#line 1769 "cs.ATG" +#line 1764 "cs.ATG" expr = null; Expression expr1 = null, expr2 = null; AssignmentOperatorType op; -#line 1771 "cs.ATG" +#line 1766 "cs.ATG" Location startLocation = la.Location; UnaryExpr( -#line 1772 "cs.ATG" +#line 1767 "cs.ATG" out expr); if (StartOf(7)) { AssignmentOperator( -#line 1775 "cs.ATG" +#line 1770 "cs.ATG" out op); Expr( -#line 1775 "cs.ATG" +#line 1770 "cs.ATG" out expr1); -#line 1775 "cs.ATG" +#line 1770 "cs.ATG" expr = new AssignmentExpression(expr, op, expr1); } else if ( -#line 1776 "cs.ATG" +#line 1771 "cs.ATG" la.kind == Tokens.GreaterThan && Peek(1).kind == Tokens.GreaterEqual) { AssignmentOperator( -#line 1777 "cs.ATG" +#line 1772 "cs.ATG" out op); Expr( -#line 1777 "cs.ATG" +#line 1772 "cs.ATG" out expr1); -#line 1777 "cs.ATG" +#line 1772 "cs.ATG" expr = new AssignmentExpression(expr, op, expr1); } else if (StartOf(8)) { ConditionalOrExpr( -#line 1779 "cs.ATG" +#line 1774 "cs.ATG" ref expr); if (la.kind == 13) { lexer.NextToken(); Expr( -#line 1780 "cs.ATG" +#line 1775 "cs.ATG" out expr1); -#line 1780 "cs.ATG" +#line 1775 "cs.ATG" expr = new BinaryOperatorExpression(expr, BinaryOperatorType.NullCoalescing, expr1); } if (la.kind == 12) { lexer.NextToken(); Expr( -#line 1781 "cs.ATG" +#line 1776 "cs.ATG" out expr1); Expect(9); Expr( -#line 1781 "cs.ATG" +#line 1776 "cs.ATG" out expr2); -#line 1781 "cs.ATG" +#line 1776 "cs.ATG" expr = new ConditionalExpression(expr, expr1, expr2); } } else SynErr(150); -#line 1784 "cs.ATG" +#line 1779 "cs.ATG" if (expr != null) { if (expr.StartLocation.IsEmpty) expr.StartLocation = startLocation; @@ -589,30 +589,25 @@ IsLocalAttrTarget()) { Identifier(); #line 300 "cs.ATG" - if (t.val != "field" && t.val != "method" && - t.val != "param" && - t.val != "property" && t.val != "type") - Error("attribute target specifier (field, event, method, param, property, return or type) expected"); - attributeTarget = t.val; - + attributeTarget = t.val; } Expect(9); } Attribute( -#line 309 "cs.ATG" +#line 304 "cs.ATG" out attribute); -#line 309 "cs.ATG" +#line 304 "cs.ATG" attributes.Add(attribute); while ( -#line 310 "cs.ATG" +#line 305 "cs.ATG" NotFinalComma()) { Expect(14); Attribute( -#line 310 "cs.ATG" +#line 305 "cs.ATG" out attribute); -#line 310 "cs.ATG" +#line 305 "cs.ATG" attributes.Add(attribute); } if (la.kind == 14) { @@ -620,7 +615,7 @@ out attribute); } Expect(19); -#line 312 "cs.ATG" +#line 307 "cs.ATG" section = new AttributeSection { AttributeTarget = attributeTarget, Attributes = attributes, @@ -631,76 +626,76 @@ out attribute); } void TypeModifier( -#line 691 "cs.ATG" +#line 686 "cs.ATG" ModifierList m) { switch (la.kind) { case 89: { lexer.NextToken(); -#line 693 "cs.ATG" +#line 688 "cs.ATG" m.Add(Modifiers.New, t.Location); break; } case 98: { lexer.NextToken(); -#line 694 "cs.ATG" +#line 689 "cs.ATG" m.Add(Modifiers.Public, t.Location); break; } case 97: { lexer.NextToken(); -#line 695 "cs.ATG" +#line 690 "cs.ATG" m.Add(Modifiers.Protected, t.Location); break; } case 84: { lexer.NextToken(); -#line 696 "cs.ATG" +#line 691 "cs.ATG" m.Add(Modifiers.Internal, t.Location); break; } case 96: { lexer.NextToken(); -#line 697 "cs.ATG" +#line 692 "cs.ATG" m.Add(Modifiers.Private, t.Location); break; } case 119: { lexer.NextToken(); -#line 698 "cs.ATG" +#line 693 "cs.ATG" m.Add(Modifiers.Unsafe, t.Location); break; } case 49: { lexer.NextToken(); -#line 699 "cs.ATG" +#line 694 "cs.ATG" m.Add(Modifiers.Abstract, t.Location); break; } case 103: { lexer.NextToken(); -#line 700 "cs.ATG" +#line 695 "cs.ATG" m.Add(Modifiers.Sealed, t.Location); break; } case 107: { lexer.NextToken(); -#line 701 "cs.ATG" +#line 696 "cs.ATG" m.Add(Modifiers.Static, t.Location); break; } case 126: { lexer.NextToken(); -#line 702 "cs.ATG" +#line 697 "cs.ATG" m.Add(Modifiers.Partial, t.Location); break; } @@ -709,10 +704,10 @@ ModifierList m) { } void TypeDecl( -#line 359 "cs.ATG" +#line 354 "cs.ATG" ModifierList m, List attributes) { -#line 361 "cs.ATG" +#line 356 "cs.ATG" TypeReference type; List names; List p = new List(); @@ -721,11 +716,11 @@ ModifierList m, List attributes) { if (la.kind == 59) { -#line 367 "cs.ATG" +#line 362 "cs.ATG" m.Check(Modifiers.Classes); lexer.NextToken(); -#line 368 "cs.ATG" +#line 363 "cs.ATG" TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); templates = newType.Templates; compilationUnit.AddChild(newType); @@ -736,28 +731,28 @@ ModifierList m, List attributes) { Identifier(); -#line 376 "cs.ATG" +#line 371 "cs.ATG" newType.Name = t.val; if (la.kind == 23) { TypeParameterList( -#line 379 "cs.ATG" +#line 374 "cs.ATG" templates); } if (la.kind == 9) { ClassBase( -#line 381 "cs.ATG" +#line 376 "cs.ATG" out names); -#line 381 "cs.ATG" +#line 376 "cs.ATG" newType.BaseTypes = names; } while (la.kind == 127) { TypeParameterConstraintsClause( -#line 384 "cs.ATG" +#line 379 "cs.ATG" templates); } -#line 386 "cs.ATG" +#line 381 "cs.ATG" newType.BodyStartLocation = t.EndLocation; Expect(16); ClassBody(); @@ -766,18 +761,18 @@ templates); lexer.NextToken(); } -#line 390 "cs.ATG" +#line 385 "cs.ATG" newType.EndLocation = t.EndLocation; compilationUnit.BlockEnd(); } else if (StartOf(9)) { -#line 393 "cs.ATG" +#line 388 "cs.ATG" m.Check(Modifiers.StructsInterfacesEnumsDelegates); if (la.kind == 109) { lexer.NextToken(); -#line 394 "cs.ATG" +#line 389 "cs.ATG" TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); templates = newType.Templates; newType.StartLocation = m.GetDeclarationLocation(t.Location); @@ -787,42 +782,42 @@ templates); Identifier(); -#line 401 "cs.ATG" +#line 396 "cs.ATG" newType.Name = t.val; if (la.kind == 23) { TypeParameterList( -#line 404 "cs.ATG" +#line 399 "cs.ATG" templates); } if (la.kind == 9) { StructInterfaces( -#line 406 "cs.ATG" +#line 401 "cs.ATG" out names); -#line 406 "cs.ATG" +#line 401 "cs.ATG" newType.BaseTypes = names; } while (la.kind == 127) { TypeParameterConstraintsClause( -#line 409 "cs.ATG" +#line 404 "cs.ATG" templates); } -#line 412 "cs.ATG" +#line 407 "cs.ATG" newType.BodyStartLocation = t.EndLocation; StructBody(); if (la.kind == 11) { lexer.NextToken(); } -#line 414 "cs.ATG" +#line 409 "cs.ATG" newType.EndLocation = t.EndLocation; compilationUnit.BlockEnd(); } else if (la.kind == 83) { lexer.NextToken(); -#line 418 "cs.ATG" +#line 413 "cs.ATG" TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); templates = newType.Templates; compilationUnit.AddChild(newType); @@ -832,42 +827,42 @@ templates); Identifier(); -#line 425 "cs.ATG" +#line 420 "cs.ATG" newType.Name = t.val; if (la.kind == 23) { TypeParameterList( -#line 428 "cs.ATG" +#line 423 "cs.ATG" templates); } if (la.kind == 9) { InterfaceBase( -#line 430 "cs.ATG" +#line 425 "cs.ATG" out names); -#line 430 "cs.ATG" +#line 425 "cs.ATG" newType.BaseTypes = names; } while (la.kind == 127) { TypeParameterConstraintsClause( -#line 433 "cs.ATG" +#line 428 "cs.ATG" templates); } -#line 435 "cs.ATG" +#line 430 "cs.ATG" newType.BodyStartLocation = t.EndLocation; InterfaceBody(); if (la.kind == 11) { lexer.NextToken(); } -#line 437 "cs.ATG" +#line 432 "cs.ATG" newType.EndLocation = t.EndLocation; compilationUnit.BlockEnd(); } else if (la.kind == 68) { lexer.NextToken(); -#line 441 "cs.ATG" +#line 436 "cs.ATG" TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); compilationUnit.AddChild(newType); compilationUnit.BlockStart(newType); @@ -876,79 +871,79 @@ templates); Identifier(); -#line 447 "cs.ATG" +#line 442 "cs.ATG" newType.Name = t.val; if (la.kind == 9) { lexer.NextToken(); IntegralType( -#line 448 "cs.ATG" +#line 443 "cs.ATG" out name); -#line 448 "cs.ATG" +#line 443 "cs.ATG" newType.BaseTypes.Add(new TypeReference(name, true)); } -#line 450 "cs.ATG" +#line 445 "cs.ATG" newType.BodyStartLocation = t.EndLocation; EnumBody(); if (la.kind == 11) { lexer.NextToken(); } -#line 452 "cs.ATG" +#line 447 "cs.ATG" newType.EndLocation = t.EndLocation; compilationUnit.BlockEnd(); } else { lexer.NextToken(); -#line 456 "cs.ATG" +#line 451 "cs.ATG" DelegateDeclaration delegateDeclr = new DelegateDeclaration(m.Modifier, attributes); templates = delegateDeclr.Templates; delegateDeclr.StartLocation = m.GetDeclarationLocation(t.Location); if ( -#line 460 "cs.ATG" +#line 455 "cs.ATG" NotVoidPointer()) { Expect(123); -#line 460 "cs.ATG" +#line 455 "cs.ATG" delegateDeclr.ReturnType = new TypeReference("System.Void", true); } else if (StartOf(10)) { Type( -#line 461 "cs.ATG" +#line 456 "cs.ATG" out type); -#line 461 "cs.ATG" +#line 456 "cs.ATG" delegateDeclr.ReturnType = type; } else SynErr(152); Identifier(); -#line 463 "cs.ATG" +#line 458 "cs.ATG" delegateDeclr.Name = t.val; if (la.kind == 23) { TypeParameterList( -#line 466 "cs.ATG" +#line 461 "cs.ATG" templates); } Expect(20); if (StartOf(11)) { FormalParameterList( -#line 468 "cs.ATG" +#line 463 "cs.ATG" p); -#line 468 "cs.ATG" +#line 463 "cs.ATG" delegateDeclr.Parameters = p; } Expect(21); while (la.kind == 127) { TypeParameterConstraintsClause( -#line 472 "cs.ATG" +#line 467 "cs.ATG" templates); } Expect(11); -#line 474 "cs.ATG" +#line 469 "cs.ATG" delegateDeclr.EndLocation = t.EndLocation; compilationUnit.AddChild(delegateDeclr); @@ -957,87 +952,87 @@ templates); } void TypeParameterList( -#line 2349 "cs.ATG" +#line 2344 "cs.ATG" List templates) { -#line 2351 "cs.ATG" +#line 2346 "cs.ATG" AttributeSection section; List attributes = new List(); Expect(23); while (la.kind == 18) { AttributeSection( -#line 2355 "cs.ATG" +#line 2350 "cs.ATG" out section); -#line 2355 "cs.ATG" +#line 2350 "cs.ATG" attributes.Add(section); } Identifier(); -#line 2356 "cs.ATG" +#line 2351 "cs.ATG" templates.Add(new TemplateDefinition(t.val, attributes)); while (la.kind == 14) { lexer.NextToken(); while (la.kind == 18) { AttributeSection( -#line 2357 "cs.ATG" +#line 2352 "cs.ATG" out section); -#line 2357 "cs.ATG" +#line 2352 "cs.ATG" attributes.Add(section); } Identifier(); -#line 2358 "cs.ATG" +#line 2353 "cs.ATG" templates.Add(new TemplateDefinition(t.val, attributes)); } Expect(22); } void ClassBase( -#line 489 "cs.ATG" +#line 484 "cs.ATG" out List names) { -#line 491 "cs.ATG" +#line 486 "cs.ATG" TypeReference typeRef; names = new List(); Expect(9); ClassType( -#line 495 "cs.ATG" +#line 490 "cs.ATG" out typeRef, false); -#line 495 "cs.ATG" +#line 490 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } while (la.kind == 14) { lexer.NextToken(); TypeName( -#line 496 "cs.ATG" +#line 491 "cs.ATG" out typeRef, false); -#line 496 "cs.ATG" +#line 491 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } } } void TypeParameterConstraintsClause( -#line 2362 "cs.ATG" +#line 2357 "cs.ATG" List templates) { -#line 2363 "cs.ATG" +#line 2358 "cs.ATG" string name = ""; TypeReference type; Expect(127); Identifier(); -#line 2366 "cs.ATG" +#line 2361 "cs.ATG" name = t.val; Expect(9); TypeParameterConstraintsClauseBase( -#line 2368 "cs.ATG" +#line 2363 "cs.ATG" out type); -#line 2369 "cs.ATG" +#line 2364 "cs.ATG" TemplateDefinition td = null; foreach (TemplateDefinition d in templates) { if (d.Name == name) { @@ -1050,10 +1045,10 @@ out type); while (la.kind == 14) { lexer.NextToken(); TypeParameterConstraintsClauseBase( -#line 2378 "cs.ATG" +#line 2373 "cs.ATG" out type); -#line 2379 "cs.ATG" +#line 2374 "cs.ATG" td = null; foreach (TemplateDefinition d in templates) { if (d.Name == name) { @@ -1068,109 +1063,109 @@ out type); void ClassBody() { -#line 500 "cs.ATG" +#line 495 "cs.ATG" AttributeSection section; while (StartOf(12)) { -#line 502 "cs.ATG" +#line 497 "cs.ATG" List attributes = new List(); ModifierList m = new ModifierList(); while (!(StartOf(13))) {SynErr(154); lexer.NextToken(); } while (la.kind == 18) { AttributeSection( -#line 506 "cs.ATG" +#line 501 "cs.ATG" out section); -#line 506 "cs.ATG" +#line 501 "cs.ATG" attributes.Add(section); } MemberModifiers( -#line 507 "cs.ATG" +#line 502 "cs.ATG" m); ClassMemberDecl( -#line 508 "cs.ATG" +#line 503 "cs.ATG" m, attributes); } } void StructInterfaces( -#line 512 "cs.ATG" +#line 507 "cs.ATG" out List names) { -#line 514 "cs.ATG" +#line 509 "cs.ATG" TypeReference typeRef; names = new List(); Expect(9); TypeName( -#line 518 "cs.ATG" +#line 513 "cs.ATG" out typeRef, false); -#line 518 "cs.ATG" +#line 513 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } while (la.kind == 14) { lexer.NextToken(); TypeName( -#line 519 "cs.ATG" +#line 514 "cs.ATG" out typeRef, false); -#line 519 "cs.ATG" +#line 514 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } } } void StructBody() { -#line 523 "cs.ATG" +#line 518 "cs.ATG" AttributeSection section; Expect(16); while (StartOf(14)) { -#line 526 "cs.ATG" +#line 521 "cs.ATG" List attributes = new List(); ModifierList m = new ModifierList(); while (la.kind == 18) { AttributeSection( -#line 529 "cs.ATG" +#line 524 "cs.ATG" out section); -#line 529 "cs.ATG" +#line 524 "cs.ATG" attributes.Add(section); } MemberModifiers( -#line 530 "cs.ATG" +#line 525 "cs.ATG" m); StructMemberDecl( -#line 531 "cs.ATG" +#line 526 "cs.ATG" m, attributes); } Expect(17); } void InterfaceBase( -#line 536 "cs.ATG" +#line 531 "cs.ATG" out List names) { -#line 538 "cs.ATG" +#line 533 "cs.ATG" TypeReference typeRef; names = new List(); Expect(9); TypeName( -#line 542 "cs.ATG" +#line 537 "cs.ATG" out typeRef, false); -#line 542 "cs.ATG" +#line 537 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } while (la.kind == 14) { lexer.NextToken(); TypeName( -#line 543 "cs.ATG" +#line 538 "cs.ATG" out typeRef, false); -#line 543 "cs.ATG" +#line 538 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } } } @@ -1185,72 +1180,72 @@ out typeRef, false); } void IntegralType( -#line 713 "cs.ATG" +#line 708 "cs.ATG" out string name) { -#line 713 "cs.ATG" +#line 708 "cs.ATG" name = ""; switch (la.kind) { case 102: { lexer.NextToken(); -#line 715 "cs.ATG" +#line 710 "cs.ATG" name = "System.SByte"; break; } case 54: { lexer.NextToken(); -#line 716 "cs.ATG" +#line 711 "cs.ATG" name = "System.Byte"; break; } case 104: { lexer.NextToken(); -#line 717 "cs.ATG" +#line 712 "cs.ATG" name = "System.Int16"; break; } case 120: { lexer.NextToken(); -#line 718 "cs.ATG" +#line 713 "cs.ATG" name = "System.UInt16"; break; } case 82: { lexer.NextToken(); -#line 719 "cs.ATG" +#line 714 "cs.ATG" name = "System.Int32"; break; } case 116: { lexer.NextToken(); -#line 720 "cs.ATG" +#line 715 "cs.ATG" name = "System.UInt32"; break; } case 87: { lexer.NextToken(); -#line 721 "cs.ATG" +#line 716 "cs.ATG" name = "System.Int64"; break; } case 117: { lexer.NextToken(); -#line 722 "cs.ATG" +#line 717 "cs.ATG" name = "System.UInt64"; break; } case 57: { lexer.NextToken(); -#line 723 "cs.ATG" +#line 718 "cs.ATG" name = "System.Char"; break; } @@ -1260,25 +1255,25 @@ out string name) { void EnumBody() { -#line 552 "cs.ATG" +#line 547 "cs.ATG" FieldDeclaration f; Expect(16); if (StartOf(17)) { EnumMemberDecl( -#line 555 "cs.ATG" +#line 550 "cs.ATG" out f); -#line 555 "cs.ATG" +#line 550 "cs.ATG" compilationUnit.AddChild(f); while ( -#line 556 "cs.ATG" +#line 551 "cs.ATG" NotFinalComma()) { Expect(14); EnumMemberDecl( -#line 557 "cs.ATG" +#line 552 "cs.ATG" out f); -#line 557 "cs.ATG" +#line 552 "cs.ATG" compilationUnit.AddChild(f); } if (la.kind == 14) { @@ -1289,36 +1284,36 @@ out f); } void Type( -#line 563 "cs.ATG" +#line 558 "cs.ATG" out TypeReference type) { TypeWithRestriction( -#line 565 "cs.ATG" +#line 560 "cs.ATG" out type, true, false); } void FormalParameterList( -#line 635 "cs.ATG" +#line 630 "cs.ATG" List parameter) { -#line 638 "cs.ATG" +#line 633 "cs.ATG" ParameterDeclarationExpression p; AttributeSection section; List attributes = new List(); while (la.kind == 18) { AttributeSection( -#line 643 "cs.ATG" +#line 638 "cs.ATG" out section); -#line 643 "cs.ATG" +#line 638 "cs.ATG" attributes.Add(section); } if (StartOf(18)) { FixedParameter( -#line 645 "cs.ATG" +#line 640 "cs.ATG" out p); -#line 645 "cs.ATG" +#line 640 "cs.ATG" bool paramsFound = false; p.Attributes = attributes; parameter.Add(p); @@ -1326,97 +1321,97 @@ out p); while (la.kind == 14) { lexer.NextToken(); -#line 650 "cs.ATG" +#line 645 "cs.ATG" attributes = new List(); if (paramsFound) Error("params array must be at end of parameter list"); while (la.kind == 18) { AttributeSection( -#line 651 "cs.ATG" +#line 646 "cs.ATG" out section); -#line 651 "cs.ATG" +#line 646 "cs.ATG" attributes.Add(section); } if (StartOf(18)) { FixedParameter( -#line 653 "cs.ATG" +#line 648 "cs.ATG" out p); -#line 653 "cs.ATG" +#line 648 "cs.ATG" p.Attributes = attributes; parameter.Add(p); } else if (la.kind == 95) { ParameterArray( -#line 654 "cs.ATG" +#line 649 "cs.ATG" out p); -#line 654 "cs.ATG" +#line 649 "cs.ATG" paramsFound = true; p.Attributes = attributes; parameter.Add(p); } else SynErr(157); } } else if (la.kind == 95) { ParameterArray( -#line 657 "cs.ATG" +#line 652 "cs.ATG" out p); -#line 657 "cs.ATG" +#line 652 "cs.ATG" p.Attributes = attributes; parameter.Add(p); } else SynErr(158); } void ClassType( -#line 705 "cs.ATG" +#line 700 "cs.ATG" out TypeReference typeRef, bool canBeUnbound) { -#line 706 "cs.ATG" +#line 701 "cs.ATG" TypeReference r; typeRef = null; if (StartOf(19)) { TypeName( -#line 708 "cs.ATG" +#line 703 "cs.ATG" out r, canBeUnbound); -#line 708 "cs.ATG" +#line 703 "cs.ATG" typeRef = r; } else if (la.kind == 91) { lexer.NextToken(); -#line 709 "cs.ATG" +#line 704 "cs.ATG" typeRef = new TypeReference("System.Object", true); typeRef.StartLocation = t.Location; } else if (la.kind == 108) { lexer.NextToken(); -#line 710 "cs.ATG" +#line 705 "cs.ATG" typeRef = new TypeReference("System.String", true); typeRef.StartLocation = t.Location; } else SynErr(159); } void TypeName( -#line 2290 "cs.ATG" +#line 2285 "cs.ATG" out TypeReference typeRef, bool canBeUnbound) { -#line 2291 "cs.ATG" +#line 2286 "cs.ATG" List typeArguments = null; string alias = null; string qualident; Location startLocation = la.Location; if ( -#line 2297 "cs.ATG" +#line 2292 "cs.ATG" IdentAndDoubleColon()) { Identifier(); -#line 2298 "cs.ATG" +#line 2293 "cs.ATG" alias = t.val; Expect(10); } Qualident( -#line 2301 "cs.ATG" +#line 2296 "cs.ATG" out qualident); if (la.kind == 23) { TypeArgumentList( -#line 2302 "cs.ATG" +#line 2297 "cs.ATG" out typeArguments, canBeUnbound); } -#line 2304 "cs.ATG" +#line 2299 "cs.ATG" if (alias == null) { typeRef = new TypeReference(qualident, typeArguments); } else if (alias == "global") { @@ -1427,143 +1422,143 @@ out typeArguments, canBeUnbound); } while ( -#line 2313 "cs.ATG" +#line 2308 "cs.ATG" DotAndIdent()) { Expect(15); -#line 2314 "cs.ATG" +#line 2309 "cs.ATG" typeArguments = null; Qualident( -#line 2315 "cs.ATG" +#line 2310 "cs.ATG" out qualident); if (la.kind == 23) { TypeArgumentList( -#line 2316 "cs.ATG" +#line 2311 "cs.ATG" out typeArguments, canBeUnbound); } -#line 2317 "cs.ATG" +#line 2312 "cs.ATG" typeRef = new InnerClassTypeReference(typeRef, qualident, typeArguments); } -#line 2319 "cs.ATG" +#line 2314 "cs.ATG" typeRef.StartLocation = startLocation; } void MemberModifiers( -#line 726 "cs.ATG" +#line 721 "cs.ATG" ModifierList m) { while (StartOf(20)) { switch (la.kind) { case 49: { lexer.NextToken(); -#line 729 "cs.ATG" +#line 724 "cs.ATG" m.Add(Modifiers.Abstract, t.Location); break; } case 71: { lexer.NextToken(); -#line 730 "cs.ATG" +#line 725 "cs.ATG" m.Add(Modifiers.Extern, t.Location); break; } case 84: { lexer.NextToken(); -#line 731 "cs.ATG" +#line 726 "cs.ATG" m.Add(Modifiers.Internal, t.Location); break; } case 89: { lexer.NextToken(); -#line 732 "cs.ATG" +#line 727 "cs.ATG" m.Add(Modifiers.New, t.Location); break; } case 94: { lexer.NextToken(); -#line 733 "cs.ATG" +#line 728 "cs.ATG" m.Add(Modifiers.Override, t.Location); break; } case 96: { lexer.NextToken(); -#line 734 "cs.ATG" +#line 729 "cs.ATG" m.Add(Modifiers.Private, t.Location); break; } case 97: { lexer.NextToken(); -#line 735 "cs.ATG" +#line 730 "cs.ATG" m.Add(Modifiers.Protected, t.Location); break; } case 98: { lexer.NextToken(); -#line 736 "cs.ATG" +#line 731 "cs.ATG" m.Add(Modifiers.Public, t.Location); break; } case 99: { lexer.NextToken(); -#line 737 "cs.ATG" +#line 732 "cs.ATG" m.Add(Modifiers.ReadOnly, t.Location); break; } case 103: { lexer.NextToken(); -#line 738 "cs.ATG" +#line 733 "cs.ATG" m.Add(Modifiers.Sealed, t.Location); break; } case 107: { lexer.NextToken(); -#line 739 "cs.ATG" +#line 734 "cs.ATG" m.Add(Modifiers.Static, t.Location); break; } case 74: { lexer.NextToken(); -#line 740 "cs.ATG" +#line 735 "cs.ATG" m.Add(Modifiers.Fixed, t.Location); break; } case 119: { lexer.NextToken(); -#line 741 "cs.ATG" +#line 736 "cs.ATG" m.Add(Modifiers.Unsafe, t.Location); break; } case 122: { lexer.NextToken(); -#line 742 "cs.ATG" +#line 737 "cs.ATG" m.Add(Modifiers.Virtual, t.Location); break; } case 124: { lexer.NextToken(); -#line 743 "cs.ATG" +#line 738 "cs.ATG" m.Add(Modifiers.Volatile, t.Location); break; } case 126: { lexer.NextToken(); -#line 744 "cs.ATG" +#line 739 "cs.ATG" m.Add(Modifiers.Partial, t.Location); break; } @@ -1572,23 +1567,23 @@ ModifierList m) { } void ClassMemberDecl( -#line 1060 "cs.ATG" +#line 1055 "cs.ATG" ModifierList m, List attributes) { -#line 1061 "cs.ATG" +#line 1056 "cs.ATG" Statement stmt = null; if (StartOf(21)) { StructMemberDecl( -#line 1063 "cs.ATG" +#line 1058 "cs.ATG" m, attributes); } else if (la.kind == 27) { -#line 1064 "cs.ATG" +#line 1059 "cs.ATG" m.Check(Modifiers.Destructors); Location startPos = la.Location; lexer.NextToken(); Identifier(); -#line 1065 "cs.ATG" +#line 1060 "cs.ATG" DestructorDeclaration d = new DestructorDeclaration(t.val, m.Modifier, attributes); d.Modifier = m.Modifier; d.StartLocation = m.GetDeclarationLocation(startPos); @@ -1596,17 +1591,17 @@ m, attributes); Expect(20); Expect(21); -#line 1069 "cs.ATG" +#line 1064 "cs.ATG" d.EndLocation = t.EndLocation; if (la.kind == 16) { Block( -#line 1069 "cs.ATG" +#line 1064 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(160); -#line 1070 "cs.ATG" +#line 1065 "cs.ATG" d.Body = (BlockStatement)stmt; compilationUnit.AddChild(d); @@ -1614,10 +1609,10 @@ out stmt); } void StructMemberDecl( -#line 748 "cs.ATG" +#line 743 "cs.ATG" ModifierList m, List attributes) { -#line 750 "cs.ATG" +#line 745 "cs.ATG" string qualident = null; TypeReference type; Expression expr; @@ -1629,18 +1624,18 @@ ModifierList m, List attributes) { if (la.kind == 60) { -#line 760 "cs.ATG" +#line 755 "cs.ATG" m.Check(Modifiers.Constants); lexer.NextToken(); -#line 761 "cs.ATG" +#line 756 "cs.ATG" Location startPos = t.Location; Type( -#line 762 "cs.ATG" +#line 757 "cs.ATG" out type); Identifier(); -#line 762 "cs.ATG" +#line 757 "cs.ATG" FieldDeclaration fd = new FieldDeclaration(attributes, type, m.Modifier | Modifiers.Const); fd.StartLocation = m.GetDeclarationLocation(startPos); VariableDeclaration f = new VariableDeclaration(t.val); @@ -1650,16 +1645,16 @@ out type); Expect(3); Expr( -#line 769 "cs.ATG" +#line 764 "cs.ATG" out expr); -#line 769 "cs.ATG" +#line 764 "cs.ATG" f.Initializer = expr; while (la.kind == 14) { lexer.NextToken(); Identifier(); -#line 770 "cs.ATG" +#line 765 "cs.ATG" f = new VariableDeclaration(t.val); f.StartLocation = t.Location; f.TypeReference = type; @@ -1667,63 +1662,63 @@ out expr); Expect(3); Expr( -#line 775 "cs.ATG" +#line 770 "cs.ATG" out expr); -#line 775 "cs.ATG" +#line 770 "cs.ATG" f.EndLocation = t.EndLocation; f.Initializer = expr; } Expect(11); -#line 776 "cs.ATG" +#line 771 "cs.ATG" fd.EndLocation = t.EndLocation; compilationUnit.AddChild(fd); } else if ( -#line 780 "cs.ATG" +#line 775 "cs.ATG" NotVoidPointer()) { -#line 780 "cs.ATG" +#line 775 "cs.ATG" m.Check(Modifiers.PropertysEventsMethods); Expect(123); -#line 781 "cs.ATG" +#line 776 "cs.ATG" Location startPos = t.Location; if ( -#line 782 "cs.ATG" +#line 777 "cs.ATG" IsExplicitInterfaceImplementation()) { TypeName( -#line 783 "cs.ATG" +#line 778 "cs.ATG" out explicitInterface, false); -#line 784 "cs.ATG" +#line 779 "cs.ATG" if (la.kind != Tokens.Dot || Peek(1).kind != Tokens.This) { qualident = TypeReference.StripLastIdentifierFromType(ref explicitInterface); } } else if (StartOf(19)) { Identifier(); -#line 787 "cs.ATG" +#line 782 "cs.ATG" qualident = t.val; } else SynErr(162); if (la.kind == 23) { TypeParameterList( -#line 790 "cs.ATG" +#line 785 "cs.ATG" templates); } Expect(20); if (la.kind == 111) { lexer.NextToken(); -#line 793 "cs.ATG" +#line 788 "cs.ATG" isExtensionMethod = true; /* C# 3.0 */ } if (StartOf(11)) { FormalParameterList( -#line 794 "cs.ATG" +#line 789 "cs.ATG" p); } Expect(21); -#line 795 "cs.ATG" +#line 790 "cs.ATG" MethodDeclaration methodDeclaration = new MethodDeclaration { Name = qualident, Modifier = m.Modifier, @@ -1742,28 +1737,28 @@ p); while (la.kind == 127) { TypeParameterConstraintsClause( -#line 813 "cs.ATG" +#line 808 "cs.ATG" templates); } if (la.kind == 16) { Block( -#line 815 "cs.ATG" +#line 810 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(163); -#line 815 "cs.ATG" +#line 810 "cs.ATG" compilationUnit.BlockEnd(); methodDeclaration.Body = (BlockStatement)stmt; } else if (la.kind == 69) { -#line 819 "cs.ATG" +#line 814 "cs.ATG" m.Check(Modifiers.PropertysEventsMethods); lexer.NextToken(); -#line 821 "cs.ATG" +#line 816 "cs.ATG" EventDeclaration eventDecl = new EventDeclaration { Modifier = m.Modifier, Attributes = attributes, @@ -1775,113 +1770,113 @@ out stmt); EventRemoveRegion removeBlock = null; Type( -#line 831 "cs.ATG" +#line 826 "cs.ATG" out type); -#line 831 "cs.ATG" +#line 826 "cs.ATG" eventDecl.TypeReference = type; if ( -#line 832 "cs.ATG" +#line 827 "cs.ATG" IsExplicitInterfaceImplementation()) { TypeName( -#line 833 "cs.ATG" +#line 828 "cs.ATG" out explicitInterface, false); -#line 834 "cs.ATG" +#line 829 "cs.ATG" qualident = TypeReference.StripLastIdentifierFromType(ref explicitInterface); -#line 835 "cs.ATG" +#line 830 "cs.ATG" eventDecl.InterfaceImplementations.Add(new InterfaceImplementation(explicitInterface, qualident)); } else if (StartOf(19)) { Identifier(); -#line 837 "cs.ATG" +#line 832 "cs.ATG" qualident = t.val; } else SynErr(164); -#line 839 "cs.ATG" +#line 834 "cs.ATG" eventDecl.Name = qualident; eventDecl.EndLocation = t.EndLocation; if (la.kind == 3) { lexer.NextToken(); Expr( -#line 840 "cs.ATG" +#line 835 "cs.ATG" out expr); -#line 840 "cs.ATG" +#line 835 "cs.ATG" eventDecl.Initializer = expr; } if (la.kind == 16) { lexer.NextToken(); -#line 841 "cs.ATG" +#line 836 "cs.ATG" eventDecl.BodyStart = t.Location; EventAccessorDecls( -#line 842 "cs.ATG" +#line 837 "cs.ATG" out addBlock, out removeBlock); Expect(17); -#line 843 "cs.ATG" +#line 838 "cs.ATG" eventDecl.BodyEnd = t.EndLocation; } if (la.kind == 11) { lexer.NextToken(); } -#line 846 "cs.ATG" +#line 841 "cs.ATG" compilationUnit.BlockEnd(); eventDecl.AddRegion = addBlock; eventDecl.RemoveRegion = removeBlock; } else if ( -#line 852 "cs.ATG" +#line 847 "cs.ATG" IdentAndLPar()) { -#line 852 "cs.ATG" +#line 847 "cs.ATG" m.Check(Modifiers.Constructors | Modifiers.StaticConstructors); Identifier(); -#line 853 "cs.ATG" +#line 848 "cs.ATG" string name = t.val; Location startPos = t.Location; Expect(20); if (StartOf(11)) { -#line 853 "cs.ATG" +#line 848 "cs.ATG" m.Check(Modifiers.Constructors); FormalParameterList( -#line 854 "cs.ATG" +#line 849 "cs.ATG" p); } Expect(21); -#line 856 "cs.ATG" +#line 851 "cs.ATG" ConstructorInitializer init = null; if (la.kind == 9) { -#line 857 "cs.ATG" +#line 852 "cs.ATG" m.Check(Modifiers.Constructors); ConstructorInitializer( -#line 858 "cs.ATG" +#line 853 "cs.ATG" out init); } -#line 860 "cs.ATG" +#line 855 "cs.ATG" ConstructorDeclaration cd = new ConstructorDeclaration(name, m.Modifier, p, init, attributes); cd.StartLocation = startPos; cd.EndLocation = t.EndLocation; if (la.kind == 16) { Block( -#line 865 "cs.ATG" +#line 860 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(165); -#line 865 "cs.ATG" +#line 860 "cs.ATG" cd.Body = (BlockStatement)stmt; compilationUnit.AddChild(cd); } else if (la.kind == 70 || la.kind == 80) { -#line 868 "cs.ATG" +#line 863 "cs.ATG" m.Check(Modifiers.Operators); if (m.isNone) Error("at least one modifier must be set"); bool isImplicit = true; @@ -1890,45 +1885,45 @@ out stmt); if (la.kind == 80) { lexer.NextToken(); -#line 873 "cs.ATG" +#line 868 "cs.ATG" startPos = t.Location; } else { lexer.NextToken(); -#line 873 "cs.ATG" +#line 868 "cs.ATG" isImplicit = false; startPos = t.Location; } Expect(92); Type( -#line 874 "cs.ATG" +#line 869 "cs.ATG" out type); -#line 874 "cs.ATG" +#line 869 "cs.ATG" TypeReference operatorType = type; Expect(20); Type( -#line 875 "cs.ATG" +#line 870 "cs.ATG" out type); Identifier(); -#line 875 "cs.ATG" +#line 870 "cs.ATG" string varName = t.val; Expect(21); -#line 876 "cs.ATG" +#line 871 "cs.ATG" Location endPos = t.Location; if (la.kind == 16) { Block( -#line 877 "cs.ATG" +#line 872 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); -#line 877 "cs.ATG" +#line 872 "cs.ATG" stmt = null; } else SynErr(166); -#line 880 "cs.ATG" +#line 875 "cs.ATG" List parameters = new List(); parameters.Add(new ParameterDeclarationExpression(type, varName)); OperatorDeclaration operatorDeclaration = new OperatorDeclaration { @@ -1946,61 +1941,61 @@ out stmt); } else if (StartOf(22)) { TypeDecl( -#line 898 "cs.ATG" +#line 893 "cs.ATG" m, attributes); } else if (StartOf(10)) { Type( -#line 900 "cs.ATG" +#line 895 "cs.ATG" out type); -#line 900 "cs.ATG" +#line 895 "cs.ATG" Location startPos = t.Location; if (la.kind == 92) { -#line 902 "cs.ATG" +#line 897 "cs.ATG" OverloadableOperatorType op; m.Check(Modifiers.Operators); if (m.isNone) Error("at least one modifier must be set"); lexer.NextToken(); OverloadableOperator( -#line 906 "cs.ATG" +#line 901 "cs.ATG" out op); -#line 906 "cs.ATG" +#line 901 "cs.ATG" TypeReference firstType, secondType = null; string secondName = null; Expect(20); Type( -#line 907 "cs.ATG" +#line 902 "cs.ATG" out firstType); Identifier(); -#line 907 "cs.ATG" +#line 902 "cs.ATG" string firstName = t.val; if (la.kind == 14) { lexer.NextToken(); Type( -#line 908 "cs.ATG" +#line 903 "cs.ATG" out secondType); Identifier(); -#line 908 "cs.ATG" +#line 903 "cs.ATG" secondName = t.val; } else if (la.kind == 21) { } else SynErr(167); -#line 916 "cs.ATG" +#line 911 "cs.ATG" Location endPos = t.Location; Expect(21); if (la.kind == 16) { Block( -#line 917 "cs.ATG" +#line 912 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(168); -#line 919 "cs.ATG" +#line 914 "cs.ATG" if (op == OverloadableOperatorType.Add && secondType == null) op = OverloadableOperatorType.UnaryPlus; if (op == OverloadableOperatorType.Subtract && secondType == null) @@ -2022,75 +2017,75 @@ out stmt); compilationUnit.AddChild(operatorDeclaration); } else if ( -#line 941 "cs.ATG" +#line 936 "cs.ATG" IsVarDecl()) { -#line 942 "cs.ATG" +#line 937 "cs.ATG" m.Check(Modifiers.Fields); FieldDeclaration fd = new FieldDeclaration(attributes, type, m.Modifier); fd.StartLocation = m.GetDeclarationLocation(startPos); if ( -#line 946 "cs.ATG" +#line 941 "cs.ATG" m.Contains(Modifiers.Fixed)) { VariableDeclarator( -#line 947 "cs.ATG" +#line 942 "cs.ATG" fd); Expect(18); Expr( -#line 949 "cs.ATG" +#line 944 "cs.ATG" out expr); -#line 949 "cs.ATG" +#line 944 "cs.ATG" if (fd.Fields.Count > 0) fd.Fields[fd.Fields.Count-1].FixedArrayInitialization = expr; Expect(19); while (la.kind == 14) { lexer.NextToken(); VariableDeclarator( -#line 953 "cs.ATG" +#line 948 "cs.ATG" fd); Expect(18); Expr( -#line 955 "cs.ATG" +#line 950 "cs.ATG" out expr); -#line 955 "cs.ATG" +#line 950 "cs.ATG" if (fd.Fields.Count > 0) fd.Fields[fd.Fields.Count-1].FixedArrayInitialization = expr; Expect(19); } } else if (StartOf(19)) { VariableDeclarator( -#line 960 "cs.ATG" +#line 955 "cs.ATG" fd); while (la.kind == 14) { lexer.NextToken(); VariableDeclarator( -#line 961 "cs.ATG" +#line 956 "cs.ATG" fd); } } else SynErr(169); Expect(11); -#line 963 "cs.ATG" +#line 958 "cs.ATG" fd.EndLocation = t.EndLocation; compilationUnit.AddChild(fd); } else if (la.kind == 111) { -#line 966 "cs.ATG" +#line 961 "cs.ATG" m.Check(Modifiers.Indexers); lexer.NextToken(); Expect(18); FormalParameterList( -#line 967 "cs.ATG" +#line 962 "cs.ATG" p); Expect(19); -#line 967 "cs.ATG" +#line 962 "cs.ATG" Location endLocation = t.EndLocation; Expect(16); -#line 968 "cs.ATG" +#line 963 "cs.ATG" IndexerDeclaration indexer = new IndexerDeclaration(type, p, m.Modifier, attributes); indexer.StartLocation = startPos; indexer.EndLocation = endLocation; @@ -2099,64 +2094,64 @@ p); PropertySetRegion setRegion; AccessorDecls( -#line 975 "cs.ATG" +#line 970 "cs.ATG" out getRegion, out setRegion); Expect(17); -#line 976 "cs.ATG" +#line 971 "cs.ATG" indexer.BodyEnd = t.EndLocation; indexer.GetRegion = getRegion; indexer.SetRegion = setRegion; compilationUnit.AddChild(indexer); } else if ( -#line 981 "cs.ATG" +#line 976 "cs.ATG" IsIdentifierToken(la)) { if ( -#line 982 "cs.ATG" +#line 977 "cs.ATG" IsExplicitInterfaceImplementation()) { TypeName( -#line 983 "cs.ATG" +#line 978 "cs.ATG" out explicitInterface, false); -#line 984 "cs.ATG" +#line 979 "cs.ATG" if (la.kind != Tokens.Dot || Peek(1).kind != Tokens.This) { qualident = TypeReference.StripLastIdentifierFromType(ref explicitInterface); } } else if (StartOf(19)) { Identifier(); -#line 987 "cs.ATG" +#line 982 "cs.ATG" qualident = t.val; } else SynErr(170); -#line 989 "cs.ATG" +#line 984 "cs.ATG" Location qualIdentEndLocation = t.EndLocation; if (la.kind == 16 || la.kind == 20 || la.kind == 23) { if (la.kind == 20 || la.kind == 23) { -#line 993 "cs.ATG" +#line 988 "cs.ATG" m.Check(Modifiers.PropertysEventsMethods); if (la.kind == 23) { TypeParameterList( -#line 995 "cs.ATG" +#line 990 "cs.ATG" templates); } Expect(20); if (la.kind == 111) { lexer.NextToken(); -#line 997 "cs.ATG" +#line 992 "cs.ATG" isExtensionMethod = true; } if (StartOf(11)) { FormalParameterList( -#line 998 "cs.ATG" +#line 993 "cs.ATG" p); } Expect(21); -#line 1000 "cs.ATG" +#line 995 "cs.ATG" MethodDeclaration methodDeclaration = new MethodDeclaration { Name = qualident, Modifier = m.Modifier, @@ -2174,23 +2169,23 @@ p); while (la.kind == 127) { TypeParameterConstraintsClause( -#line 1015 "cs.ATG" +#line 1010 "cs.ATG" templates); } if (la.kind == 16) { Block( -#line 1016 "cs.ATG" +#line 1011 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(171); -#line 1016 "cs.ATG" +#line 1011 "cs.ATG" methodDeclaration.Body = (BlockStatement)stmt; } else { lexer.NextToken(); -#line 1019 "cs.ATG" +#line 1014 "cs.ATG" PropertyDeclaration pDecl = new PropertyDeclaration(qualident, type, m.Modifier, attributes); if (explicitInterface != null) pDecl.InterfaceImplementations.Add(new InterfaceImplementation(explicitInterface, qualident)); @@ -2201,11 +2196,11 @@ out stmt); PropertySetRegion setRegion; AccessorDecls( -#line 1028 "cs.ATG" +#line 1023 "cs.ATG" out getRegion, out setRegion); Expect(17); -#line 1030 "cs.ATG" +#line 1025 "cs.ATG" pDecl.GetRegion = getRegion; pDecl.SetRegion = setRegion; pDecl.BodyEnd = t.EndLocation; @@ -2214,17 +2209,17 @@ out getRegion, out setRegion); } } else if (la.kind == 15) { -#line 1038 "cs.ATG" +#line 1033 "cs.ATG" m.Check(Modifiers.Indexers); lexer.NextToken(); Expect(111); Expect(18); FormalParameterList( -#line 1039 "cs.ATG" +#line 1034 "cs.ATG" p); Expect(19); -#line 1040 "cs.ATG" +#line 1035 "cs.ATG" IndexerDeclaration indexer = new IndexerDeclaration(type, p, m.Modifier, attributes); indexer.StartLocation = m.GetDeclarationLocation(startPos); indexer.EndLocation = t.EndLocation; @@ -2235,14 +2230,14 @@ p); Expect(16); -#line 1048 "cs.ATG" +#line 1043 "cs.ATG" Location bodyStart = t.Location; AccessorDecls( -#line 1049 "cs.ATG" +#line 1044 "cs.ATG" out getRegion, out setRegion); Expect(17); -#line 1050 "cs.ATG" +#line 1045 "cs.ATG" indexer.BodyStart = bodyStart; indexer.BodyEnd = t.EndLocation; indexer.GetRegion = getRegion; @@ -2256,7 +2251,7 @@ out getRegion, out setRegion); void InterfaceMemberDecl() { -#line 1077 "cs.ATG" +#line 1072 "cs.ATG" TypeReference type; AttributeSection section; @@ -2271,49 +2266,49 @@ out getRegion, out setRegion); while (la.kind == 18) { AttributeSection( -#line 1090 "cs.ATG" +#line 1085 "cs.ATG" out section); -#line 1090 "cs.ATG" +#line 1085 "cs.ATG" attributes.Add(section); } if (la.kind == 89) { lexer.NextToken(); -#line 1091 "cs.ATG" +#line 1086 "cs.ATG" mod = Modifiers.New; startLocation = t.Location; } if ( -#line 1094 "cs.ATG" +#line 1089 "cs.ATG" NotVoidPointer()) { Expect(123); -#line 1094 "cs.ATG" +#line 1089 "cs.ATG" if (startLocation.IsEmpty) startLocation = t.Location; Identifier(); -#line 1095 "cs.ATG" +#line 1090 "cs.ATG" name = t.val; if (la.kind == 23) { TypeParameterList( -#line 1096 "cs.ATG" +#line 1091 "cs.ATG" templates); } Expect(20); if (StartOf(11)) { FormalParameterList( -#line 1097 "cs.ATG" +#line 1092 "cs.ATG" parameters); } Expect(21); while (la.kind == 127) { TypeParameterConstraintsClause( -#line 1098 "cs.ATG" +#line 1093 "cs.ATG" templates); } Expect(11); -#line 1100 "cs.ATG" +#line 1095 "cs.ATG" MethodDeclaration md = new MethodDeclaration { Name = name, Modifier = mod, TypeReference = new TypeReference("System.Void", true), Parameters = parameters, Attributes = attributes, Templates = templates, @@ -2324,37 +2319,37 @@ templates); } else if (StartOf(23)) { if (StartOf(10)) { Type( -#line 1108 "cs.ATG" +#line 1103 "cs.ATG" out type); -#line 1108 "cs.ATG" +#line 1103 "cs.ATG" if (startLocation.IsEmpty) startLocation = t.Location; if (StartOf(19)) { Identifier(); -#line 1110 "cs.ATG" +#line 1105 "cs.ATG" name = t.val; Location qualIdentEndLocation = t.EndLocation; if (la.kind == 20 || la.kind == 23) { if (la.kind == 23) { TypeParameterList( -#line 1114 "cs.ATG" +#line 1109 "cs.ATG" templates); } Expect(20); if (StartOf(11)) { FormalParameterList( -#line 1115 "cs.ATG" +#line 1110 "cs.ATG" parameters); } Expect(21); while (la.kind == 127) { TypeParameterConstraintsClause( -#line 1117 "cs.ATG" +#line 1112 "cs.ATG" templates); } Expect(11); -#line 1118 "cs.ATG" +#line 1113 "cs.ATG" MethodDeclaration md = new MethodDeclaration { Name = name, Modifier = mod, TypeReference = type, Parameters = parameters, Attributes = attributes, Templates = templates, @@ -2364,58 +2359,58 @@ templates); } else if (la.kind == 16) { -#line 1127 "cs.ATG" +#line 1122 "cs.ATG" PropertyDeclaration pd = new PropertyDeclaration(name, type, mod, attributes); compilationUnit.AddChild(pd); lexer.NextToken(); -#line 1130 "cs.ATG" +#line 1125 "cs.ATG" Location bodyStart = t.Location; InterfaceAccessors( -#line 1131 "cs.ATG" +#line 1126 "cs.ATG" out getBlock, out setBlock); Expect(17); -#line 1132 "cs.ATG" +#line 1127 "cs.ATG" pd.GetRegion = getBlock; pd.SetRegion = setBlock; pd.StartLocation = startLocation; pd.EndLocation = qualIdentEndLocation; pd.BodyStart = bodyStart; pd.BodyEnd = t.EndLocation; } else SynErr(175); } else if (la.kind == 111) { lexer.NextToken(); Expect(18); FormalParameterList( -#line 1135 "cs.ATG" +#line 1130 "cs.ATG" parameters); Expect(19); -#line 1136 "cs.ATG" +#line 1131 "cs.ATG" Location bracketEndLocation = t.EndLocation; -#line 1137 "cs.ATG" +#line 1132 "cs.ATG" IndexerDeclaration id = new IndexerDeclaration(type, parameters, mod, attributes); compilationUnit.AddChild(id); Expect(16); -#line 1139 "cs.ATG" +#line 1134 "cs.ATG" Location bodyStart = t.Location; InterfaceAccessors( -#line 1140 "cs.ATG" +#line 1135 "cs.ATG" out getBlock, out setBlock); Expect(17); -#line 1142 "cs.ATG" +#line 1137 "cs.ATG" id.GetRegion = getBlock; id.SetRegion = setBlock; id.StartLocation = startLocation; id.EndLocation = bracketEndLocation; id.BodyStart = bodyStart; id.BodyEnd = t.EndLocation; } else SynErr(176); } else { lexer.NextToken(); -#line 1145 "cs.ATG" +#line 1140 "cs.ATG" if (startLocation.IsEmpty) startLocation = t.Location; Type( -#line 1146 "cs.ATG" +#line 1141 "cs.ATG" out type); Identifier(); -#line 1147 "cs.ATG" +#line 1142 "cs.ATG" EventDeclaration ed = new EventDeclaration { TypeReference = type, Name = t.val, Modifier = mod, Attributes = attributes }; @@ -2423,17 +2418,17 @@ out type); Expect(11); -#line 1153 "cs.ATG" +#line 1148 "cs.ATG" ed.StartLocation = startLocation; ed.EndLocation = t.EndLocation; } } else SynErr(177); } void EnumMemberDecl( -#line 1158 "cs.ATG" +#line 1153 "cs.ATG" out FieldDeclaration f) { -#line 1160 "cs.ATG" +#line 1155 "cs.ATG" Expression expr = null; List attributes = new List(); AttributeSection section = null; @@ -2441,15 +2436,15 @@ out FieldDeclaration f) { while (la.kind == 18) { AttributeSection( -#line 1166 "cs.ATG" +#line 1161 "cs.ATG" out section); -#line 1166 "cs.ATG" +#line 1161 "cs.ATG" attributes.Add(section); } Identifier(); -#line 1167 "cs.ATG" +#line 1162 "cs.ATG" f = new FieldDeclaration(attributes); varDecl = new VariableDeclaration(t.val); f.Fields.Add(varDecl); @@ -2459,19 +2454,19 @@ out section); if (la.kind == 3) { lexer.NextToken(); Expr( -#line 1173 "cs.ATG" +#line 1168 "cs.ATG" out expr); -#line 1173 "cs.ATG" +#line 1168 "cs.ATG" varDecl.Initializer = expr; } } void TypeWithRestriction( -#line 568 "cs.ATG" +#line 563 "cs.ATG" out TypeReference type, bool allowNullable, bool canBeUnbound) { -#line 570 "cs.ATG" +#line 565 "cs.ATG" Location startPos = la.Location; string name; int pointer = 0; @@ -2479,59 +2474,59 @@ out TypeReference type, bool allowNullable, bool canBeUnbound) { if (StartOf(4)) { ClassType( -#line 576 "cs.ATG" +#line 571 "cs.ATG" out type, canBeUnbound); } else if (StartOf(5)) { SimpleType( -#line 577 "cs.ATG" +#line 572 "cs.ATG" out name); -#line 577 "cs.ATG" +#line 572 "cs.ATG" type = new TypeReference(name, true); } else if (la.kind == 123) { lexer.NextToken(); Expect(6); -#line 578 "cs.ATG" +#line 573 "cs.ATG" pointer = 1; type = new TypeReference("System.Void", true); } else SynErr(178); -#line 579 "cs.ATG" +#line 574 "cs.ATG" List r = new List(); if ( -#line 581 "cs.ATG" +#line 576 "cs.ATG" allowNullable && la.kind == Tokens.Question) { NullableQuestionMark( -#line 581 "cs.ATG" +#line 576 "cs.ATG" ref type); } while ( -#line 583 "cs.ATG" +#line 578 "cs.ATG" IsPointerOrDims()) { -#line 583 "cs.ATG" +#line 578 "cs.ATG" int i = 0; if (la.kind == 6) { lexer.NextToken(); -#line 584 "cs.ATG" +#line 579 "cs.ATG" ++pointer; } else if (la.kind == 18) { lexer.NextToken(); while (la.kind == 14) { lexer.NextToken(); -#line 585 "cs.ATG" +#line 580 "cs.ATG" ++i; } Expect(19); -#line 585 "cs.ATG" +#line 580 "cs.ATG" r.Add(i); } else SynErr(179); } -#line 588 "cs.ATG" +#line 583 "cs.ATG" if (type != null) { type.RankSpecifier = r.ToArray(); type.PointerNestingLevel = pointer; @@ -2542,57 +2537,57 @@ IsPointerOrDims()) { } void SimpleType( -#line 624 "cs.ATG" +#line 619 "cs.ATG" out string name) { -#line 625 "cs.ATG" +#line 620 "cs.ATG" name = String.Empty; if (StartOf(24)) { IntegralType( -#line 627 "cs.ATG" +#line 622 "cs.ATG" out name); } else if (la.kind == 75) { lexer.NextToken(); -#line 628 "cs.ATG" +#line 623 "cs.ATG" name = "System.Single"; } else if (la.kind == 66) { lexer.NextToken(); -#line 629 "cs.ATG" +#line 624 "cs.ATG" name = "System.Double"; } else if (la.kind == 62) { lexer.NextToken(); -#line 630 "cs.ATG" +#line 625 "cs.ATG" name = "System.Decimal"; } else if (la.kind == 52) { lexer.NextToken(); -#line 631 "cs.ATG" +#line 626 "cs.ATG" name = "System.Boolean"; } else SynErr(180); } void NullableQuestionMark( -#line 2323 "cs.ATG" +#line 2318 "cs.ATG" ref TypeReference typeRef) { -#line 2324 "cs.ATG" +#line 2319 "cs.ATG" List typeArguments = new List(1); Expect(12); -#line 2328 "cs.ATG" +#line 2323 "cs.ATG" if (typeRef != null) typeArguments.Add(typeRef); typeRef = new TypeReference("System.Nullable", typeArguments) { IsKeyword = true }; } void FixedParameter( -#line 661 "cs.ATG" +#line 656 "cs.ATG" out ParameterDeclarationExpression p) { -#line 663 "cs.ATG" +#line 658 "cs.ATG" TypeReference type; ParameterModifiers mod = ParameterModifiers.In; Location start = la.Location; @@ -2601,82 +2596,82 @@ out ParameterDeclarationExpression p) { if (la.kind == 100) { lexer.NextToken(); -#line 669 "cs.ATG" +#line 664 "cs.ATG" mod = ParameterModifiers.Ref; } else { lexer.NextToken(); -#line 670 "cs.ATG" +#line 665 "cs.ATG" mod = ParameterModifiers.Out; } } Type( -#line 672 "cs.ATG" +#line 667 "cs.ATG" out type); Identifier(); -#line 672 "cs.ATG" +#line 667 "cs.ATG" p = new ParameterDeclarationExpression(type, t.val, mod); p.StartLocation = start; p.EndLocation = t.Location; } void ParameterArray( -#line 675 "cs.ATG" +#line 670 "cs.ATG" out ParameterDeclarationExpression p) { -#line 676 "cs.ATG" +#line 671 "cs.ATG" TypeReference type; Expect(95); Type( -#line 678 "cs.ATG" +#line 673 "cs.ATG" out type); Identifier(); -#line 678 "cs.ATG" +#line 673 "cs.ATG" p = new ParameterDeclarationExpression(type, t.val, ParameterModifiers.Params); } void AccessorModifiers( -#line 681 "cs.ATG" +#line 676 "cs.ATG" out ModifierList m) { -#line 682 "cs.ATG" +#line 677 "cs.ATG" m = new ModifierList(); if (la.kind == 96) { lexer.NextToken(); -#line 684 "cs.ATG" +#line 679 "cs.ATG" m.Add(Modifiers.Private, t.Location); } else if (la.kind == 97) { lexer.NextToken(); -#line 685 "cs.ATG" +#line 680 "cs.ATG" m.Add(Modifiers.Protected, t.Location); if (la.kind == 84) { lexer.NextToken(); -#line 686 "cs.ATG" +#line 681 "cs.ATG" m.Add(Modifiers.Internal, t.Location); } } else if (la.kind == 84) { lexer.NextToken(); -#line 687 "cs.ATG" +#line 682 "cs.ATG" m.Add(Modifiers.Internal, t.Location); if (la.kind == 97) { lexer.NextToken(); -#line 688 "cs.ATG" +#line 683 "cs.ATG" m.Add(Modifiers.Protected, t.Location); } } else SynErr(181); } void Block( -#line 1293 "cs.ATG" +#line 1288 "cs.ATG" out Statement stmt) { Expect(16); -#line 1295 "cs.ATG" +#line 1290 "cs.ATG" BlockStatement blockStmt = new BlockStatement(); blockStmt.StartLocation = t.Location; compilationUnit.BlockStart(blockStmt); @@ -2688,7 +2683,7 @@ out Statement stmt) { while (!(la.kind == 0 || la.kind == 17)) {SynErr(182); lexer.NextToken(); } Expect(17); -#line 1303 "cs.ATG" +#line 1298 "cs.ATG" stmt = blockStmt; blockStmt.EndLocation = t.EndLocation; compilationUnit.BlockEnd(); @@ -2696,10 +2691,10 @@ out Statement stmt) { } void EventAccessorDecls( -#line 1230 "cs.ATG" +#line 1225 "cs.ATG" out EventAddRegion addBlock, out EventRemoveRegion removeBlock) { -#line 1231 "cs.ATG" +#line 1226 "cs.ATG" AttributeSection section; List attributes = new List(); Statement stmt; @@ -2708,93 +2703,93 @@ out EventAddRegion addBlock, out EventRemoveRegion removeBlock) { while (la.kind == 18) { AttributeSection( -#line 1238 "cs.ATG" +#line 1233 "cs.ATG" out section); -#line 1238 "cs.ATG" +#line 1233 "cs.ATG" attributes.Add(section); } if (la.kind == 130) { -#line 1240 "cs.ATG" +#line 1235 "cs.ATG" addBlock = new EventAddRegion(attributes); AddAccessorDecl( -#line 1241 "cs.ATG" +#line 1236 "cs.ATG" out stmt); -#line 1241 "cs.ATG" +#line 1236 "cs.ATG" attributes = new List(); addBlock.Block = (BlockStatement)stmt; while (la.kind == 18) { AttributeSection( -#line 1242 "cs.ATG" +#line 1237 "cs.ATG" out section); -#line 1242 "cs.ATG" +#line 1237 "cs.ATG" attributes.Add(section); } RemoveAccessorDecl( -#line 1243 "cs.ATG" +#line 1238 "cs.ATG" out stmt); -#line 1243 "cs.ATG" +#line 1238 "cs.ATG" removeBlock = new EventRemoveRegion(attributes); removeBlock.Block = (BlockStatement)stmt; } else if (la.kind == 131) { RemoveAccessorDecl( -#line 1245 "cs.ATG" +#line 1240 "cs.ATG" out stmt); -#line 1245 "cs.ATG" +#line 1240 "cs.ATG" removeBlock = new EventRemoveRegion(attributes); removeBlock.Block = (BlockStatement)stmt; attributes = new List(); while (la.kind == 18) { AttributeSection( -#line 1246 "cs.ATG" +#line 1241 "cs.ATG" out section); -#line 1246 "cs.ATG" +#line 1241 "cs.ATG" attributes.Add(section); } AddAccessorDecl( -#line 1247 "cs.ATG" +#line 1242 "cs.ATG" out stmt); -#line 1247 "cs.ATG" +#line 1242 "cs.ATG" addBlock = new EventAddRegion(attributes); addBlock.Block = (BlockStatement)stmt; } else SynErr(183); } void ConstructorInitializer( -#line 1323 "cs.ATG" +#line 1318 "cs.ATG" out ConstructorInitializer ci) { -#line 1324 "cs.ATG" +#line 1319 "cs.ATG" Expression expr; ci = new ConstructorInitializer(); Expect(9); if (la.kind == 51) { lexer.NextToken(); -#line 1328 "cs.ATG" +#line 1323 "cs.ATG" ci.ConstructorInitializerType = ConstructorInitializerType.Base; } else if (la.kind == 111) { lexer.NextToken(); -#line 1329 "cs.ATG" +#line 1324 "cs.ATG" ci.ConstructorInitializerType = ConstructorInitializerType.This; } else SynErr(184); Expect(20); if (StartOf(26)) { Argument( -#line 1332 "cs.ATG" +#line 1327 "cs.ATG" out expr); -#line 1332 "cs.ATG" +#line 1327 "cs.ATG" SafeAdd(ci, ci.Arguments, expr); while (la.kind == 14) { lexer.NextToken(); Argument( -#line 1333 "cs.ATG" +#line 1328 "cs.ATG" out expr); -#line 1333 "cs.ATG" +#line 1328 "cs.ATG" SafeAdd(ci, ci.Arguments, expr); } } @@ -2802,161 +2797,161 @@ out expr); } void OverloadableOperator( -#line 1346 "cs.ATG" +#line 1341 "cs.ATG" out OverloadableOperatorType op) { -#line 1347 "cs.ATG" +#line 1342 "cs.ATG" op = OverloadableOperatorType.None; switch (la.kind) { case 4: { lexer.NextToken(); -#line 1349 "cs.ATG" +#line 1344 "cs.ATG" op = OverloadableOperatorType.Add; break; } case 5: { lexer.NextToken(); -#line 1350 "cs.ATG" +#line 1345 "cs.ATG" op = OverloadableOperatorType.Subtract; break; } case 24: { lexer.NextToken(); -#line 1352 "cs.ATG" +#line 1347 "cs.ATG" op = OverloadableOperatorType.Not; break; } case 27: { lexer.NextToken(); -#line 1353 "cs.ATG" +#line 1348 "cs.ATG" op = OverloadableOperatorType.BitNot; break; } case 31: { lexer.NextToken(); -#line 1355 "cs.ATG" +#line 1350 "cs.ATG" op = OverloadableOperatorType.Increment; break; } case 32: { lexer.NextToken(); -#line 1356 "cs.ATG" +#line 1351 "cs.ATG" op = OverloadableOperatorType.Decrement; break; } case 113: { lexer.NextToken(); -#line 1358 "cs.ATG" +#line 1353 "cs.ATG" op = OverloadableOperatorType.IsTrue; break; } case 72: { lexer.NextToken(); -#line 1359 "cs.ATG" +#line 1354 "cs.ATG" op = OverloadableOperatorType.IsFalse; break; } case 6: { lexer.NextToken(); -#line 1361 "cs.ATG" +#line 1356 "cs.ATG" op = OverloadableOperatorType.Multiply; break; } case 7: { lexer.NextToken(); -#line 1362 "cs.ATG" +#line 1357 "cs.ATG" op = OverloadableOperatorType.Divide; break; } case 8: { lexer.NextToken(); -#line 1363 "cs.ATG" +#line 1358 "cs.ATG" op = OverloadableOperatorType.Modulus; break; } case 28: { lexer.NextToken(); -#line 1365 "cs.ATG" +#line 1360 "cs.ATG" op = OverloadableOperatorType.BitwiseAnd; break; } case 29: { lexer.NextToken(); -#line 1366 "cs.ATG" +#line 1361 "cs.ATG" op = OverloadableOperatorType.BitwiseOr; break; } case 30: { lexer.NextToken(); -#line 1367 "cs.ATG" +#line 1362 "cs.ATG" op = OverloadableOperatorType.ExclusiveOr; break; } case 37: { lexer.NextToken(); -#line 1369 "cs.ATG" +#line 1364 "cs.ATG" op = OverloadableOperatorType.ShiftLeft; break; } case 33: { lexer.NextToken(); -#line 1370 "cs.ATG" +#line 1365 "cs.ATG" op = OverloadableOperatorType.Equality; break; } case 34: { lexer.NextToken(); -#line 1371 "cs.ATG" +#line 1366 "cs.ATG" op = OverloadableOperatorType.InEquality; break; } case 23: { lexer.NextToken(); -#line 1372 "cs.ATG" +#line 1367 "cs.ATG" op = OverloadableOperatorType.LessThan; break; } case 35: { lexer.NextToken(); -#line 1373 "cs.ATG" +#line 1368 "cs.ATG" op = OverloadableOperatorType.GreaterThanOrEqual; break; } case 36: { lexer.NextToken(); -#line 1374 "cs.ATG" +#line 1369 "cs.ATG" op = OverloadableOperatorType.LessThanOrEqual; break; } case 22: { lexer.NextToken(); -#line 1375 "cs.ATG" +#line 1370 "cs.ATG" op = OverloadableOperatorType.GreaterThan; if (la.kind == 22) { lexer.NextToken(); -#line 1375 "cs.ATG" +#line 1370 "cs.ATG" op = OverloadableOperatorType.ShiftRight; } break; @@ -2966,34 +2961,34 @@ out OverloadableOperatorType op) { } void VariableDeclarator( -#line 1285 "cs.ATG" +#line 1280 "cs.ATG" FieldDeclaration parentFieldDeclaration) { -#line 1286 "cs.ATG" +#line 1281 "cs.ATG" Expression expr = null; Identifier(); -#line 1288 "cs.ATG" +#line 1283 "cs.ATG" VariableDeclaration f = new VariableDeclaration(t.val); f.StartLocation = t.Location; if (la.kind == 3) { lexer.NextToken(); VariableInitializer( -#line 1289 "cs.ATG" +#line 1284 "cs.ATG" out expr); -#line 1289 "cs.ATG" +#line 1284 "cs.ATG" f.Initializer = expr; } -#line 1290 "cs.ATG" +#line 1285 "cs.ATG" f.EndLocation = t.EndLocation; SafeAdd(parentFieldDeclaration, parentFieldDeclaration.Fields, f); } void AccessorDecls( -#line 1177 "cs.ATG" +#line 1172 "cs.ATG" out PropertyGetRegion getBlock, out PropertySetRegion setBlock) { -#line 1179 "cs.ATG" +#line 1174 "cs.ATG" List attributes = new List(); AttributeSection section; getBlock = null; @@ -3002,92 +2997,92 @@ out PropertyGetRegion getBlock, out PropertySetRegion setBlock) { while (la.kind == 18) { AttributeSection( -#line 1186 "cs.ATG" +#line 1181 "cs.ATG" out section); -#line 1186 "cs.ATG" +#line 1181 "cs.ATG" attributes.Add(section); } if (la.kind == 84 || la.kind == 96 || la.kind == 97) { AccessorModifiers( -#line 1187 "cs.ATG" +#line 1182 "cs.ATG" out modifiers); } if (la.kind == 128) { GetAccessorDecl( -#line 1189 "cs.ATG" +#line 1184 "cs.ATG" out getBlock, attributes); -#line 1190 "cs.ATG" +#line 1185 "cs.ATG" if (modifiers != null) {getBlock.Modifier = modifiers.Modifier; } if (StartOf(27)) { -#line 1191 "cs.ATG" +#line 1186 "cs.ATG" attributes = new List(); modifiers = null; while (la.kind == 18) { AttributeSection( -#line 1192 "cs.ATG" +#line 1187 "cs.ATG" out section); -#line 1192 "cs.ATG" +#line 1187 "cs.ATG" attributes.Add(section); } if (la.kind == 84 || la.kind == 96 || la.kind == 97) { AccessorModifiers( -#line 1193 "cs.ATG" +#line 1188 "cs.ATG" out modifiers); } SetAccessorDecl( -#line 1194 "cs.ATG" +#line 1189 "cs.ATG" out setBlock, attributes); -#line 1195 "cs.ATG" +#line 1190 "cs.ATG" if (modifiers != null) {setBlock.Modifier = modifiers.Modifier; } } } else if (la.kind == 129) { SetAccessorDecl( -#line 1198 "cs.ATG" +#line 1193 "cs.ATG" out setBlock, attributes); -#line 1199 "cs.ATG" +#line 1194 "cs.ATG" if (modifiers != null) {setBlock.Modifier = modifiers.Modifier; } if (StartOf(28)) { -#line 1200 "cs.ATG" +#line 1195 "cs.ATG" attributes = new List(); modifiers = null; while (la.kind == 18) { AttributeSection( -#line 1201 "cs.ATG" +#line 1196 "cs.ATG" out section); -#line 1201 "cs.ATG" +#line 1196 "cs.ATG" attributes.Add(section); } if (la.kind == 84 || la.kind == 96 || la.kind == 97) { AccessorModifiers( -#line 1202 "cs.ATG" +#line 1197 "cs.ATG" out modifiers); } GetAccessorDecl( -#line 1203 "cs.ATG" +#line 1198 "cs.ATG" out getBlock, attributes); -#line 1204 "cs.ATG" +#line 1199 "cs.ATG" if (modifiers != null) {getBlock.Modifier = modifiers.Modifier; } } } else if (StartOf(19)) { Identifier(); -#line 1206 "cs.ATG" +#line 1201 "cs.ATG" Error("get or set accessor declaration expected"); } else SynErr(186); } void InterfaceAccessors( -#line 1251 "cs.ATG" +#line 1246 "cs.ATG" out PropertyGetRegion getBlock, out PropertySetRegion setBlock) { -#line 1253 "cs.ATG" +#line 1248 "cs.ATG" AttributeSection section; List attributes = new List(); getBlock = null; setBlock = null; @@ -3095,218 +3090,218 @@ out PropertyGetRegion getBlock, out PropertySetRegion setBlock) { while (la.kind == 18) { AttributeSection( -#line 1259 "cs.ATG" +#line 1254 "cs.ATG" out section); -#line 1259 "cs.ATG" +#line 1254 "cs.ATG" attributes.Add(section); } -#line 1260 "cs.ATG" +#line 1255 "cs.ATG" Location startLocation = la.Location; if (la.kind == 128) { lexer.NextToken(); -#line 1262 "cs.ATG" +#line 1257 "cs.ATG" getBlock = new PropertyGetRegion(null, attributes); } else if (la.kind == 129) { lexer.NextToken(); -#line 1263 "cs.ATG" +#line 1258 "cs.ATG" setBlock = new PropertySetRegion(null, attributes); } else SynErr(187); Expect(11); -#line 1266 "cs.ATG" +#line 1261 "cs.ATG" if (getBlock != null) { getBlock.StartLocation = startLocation; getBlock.EndLocation = t.EndLocation; } if (setBlock != null) { setBlock.StartLocation = startLocation; setBlock.EndLocation = t.EndLocation; } attributes = new List(); if (la.kind == 18 || la.kind == 128 || la.kind == 129) { while (la.kind == 18) { AttributeSection( -#line 1270 "cs.ATG" +#line 1265 "cs.ATG" out section); -#line 1270 "cs.ATG" +#line 1265 "cs.ATG" attributes.Add(section); } -#line 1271 "cs.ATG" +#line 1266 "cs.ATG" startLocation = la.Location; if (la.kind == 128) { lexer.NextToken(); -#line 1273 "cs.ATG" +#line 1268 "cs.ATG" if (getBlock != null) Error("get already declared"); else { getBlock = new PropertyGetRegion(null, attributes); lastBlock = getBlock; } } else if (la.kind == 129) { lexer.NextToken(); -#line 1276 "cs.ATG" +#line 1271 "cs.ATG" if (setBlock != null) Error("set already declared"); else { setBlock = new PropertySetRegion(null, attributes); lastBlock = setBlock; } } else SynErr(188); Expect(11); -#line 1281 "cs.ATG" +#line 1276 "cs.ATG" if (lastBlock != null) { lastBlock.StartLocation = startLocation; lastBlock.EndLocation = t.EndLocation; } } } void GetAccessorDecl( -#line 1210 "cs.ATG" +#line 1205 "cs.ATG" out PropertyGetRegion getBlock, List attributes) { -#line 1211 "cs.ATG" +#line 1206 "cs.ATG" Statement stmt = null; Expect(128); -#line 1214 "cs.ATG" +#line 1209 "cs.ATG" Location startLocation = t.Location; if (la.kind == 16) { Block( -#line 1215 "cs.ATG" +#line 1210 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(189); -#line 1216 "cs.ATG" +#line 1211 "cs.ATG" getBlock = new PropertyGetRegion((BlockStatement)stmt, attributes); -#line 1217 "cs.ATG" +#line 1212 "cs.ATG" getBlock.StartLocation = startLocation; getBlock.EndLocation = t.EndLocation; } void SetAccessorDecl( -#line 1220 "cs.ATG" +#line 1215 "cs.ATG" out PropertySetRegion setBlock, List attributes) { -#line 1221 "cs.ATG" +#line 1216 "cs.ATG" Statement stmt = null; Expect(129); -#line 1224 "cs.ATG" +#line 1219 "cs.ATG" Location startLocation = t.Location; if (la.kind == 16) { Block( -#line 1225 "cs.ATG" +#line 1220 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(190); -#line 1226 "cs.ATG" +#line 1221 "cs.ATG" setBlock = new PropertySetRegion((BlockStatement)stmt, attributes); -#line 1227 "cs.ATG" +#line 1222 "cs.ATG" setBlock.StartLocation = startLocation; setBlock.EndLocation = t.EndLocation; } void AddAccessorDecl( -#line 1309 "cs.ATG" +#line 1304 "cs.ATG" out Statement stmt) { -#line 1310 "cs.ATG" +#line 1305 "cs.ATG" stmt = null; Expect(130); Block( -#line 1313 "cs.ATG" +#line 1308 "cs.ATG" out stmt); } void RemoveAccessorDecl( -#line 1316 "cs.ATG" +#line 1311 "cs.ATG" out Statement stmt) { -#line 1317 "cs.ATG" +#line 1312 "cs.ATG" stmt = null; Expect(131); Block( -#line 1320 "cs.ATG" +#line 1315 "cs.ATG" out stmt); } void VariableInitializer( -#line 1338 "cs.ATG" +#line 1333 "cs.ATG" out Expression initializerExpression) { -#line 1339 "cs.ATG" +#line 1334 "cs.ATG" TypeReference type = null; Expression expr = null; initializerExpression = null; if (StartOf(6)) { Expr( -#line 1341 "cs.ATG" +#line 1336 "cs.ATG" out initializerExpression); } else if (la.kind == 16) { CollectionInitializer( -#line 1342 "cs.ATG" +#line 1337 "cs.ATG" out initializerExpression); } else if (la.kind == 106) { lexer.NextToken(); Type( -#line 1343 "cs.ATG" +#line 1338 "cs.ATG" out type); Expect(18); Expr( -#line 1343 "cs.ATG" +#line 1338 "cs.ATG" out expr); Expect(19); -#line 1343 "cs.ATG" +#line 1338 "cs.ATG" initializerExpression = new StackAllocExpression(type, expr); } else SynErr(191); } void Statement() { -#line 1486 "cs.ATG" +#line 1481 "cs.ATG" Statement stmt = null; Location startPos = la.Location; while (!(StartOf(29))) {SynErr(192); lexer.NextToken(); } if ( -#line 1493 "cs.ATG" +#line 1488 "cs.ATG" IsLabel()) { Identifier(); -#line 1493 "cs.ATG" +#line 1488 "cs.ATG" compilationUnit.AddChild(new LabelStatement(t.val)); Expect(9); Statement(); } else if (la.kind == 60) { lexer.NextToken(); LocalVariableDecl( -#line 1497 "cs.ATG" +#line 1492 "cs.ATG" out stmt); -#line 1498 "cs.ATG" +#line 1493 "cs.ATG" if (stmt != null) { ((LocalVariableDeclaration)stmt).Modifier |= Modifiers.Const; } Expect(11); -#line 1499 "cs.ATG" +#line 1494 "cs.ATG" compilationUnit.AddChild(stmt); } else if ( -#line 1501 "cs.ATG" +#line 1496 "cs.ATG" IsLocalVarDecl()) { LocalVariableDecl( -#line 1501 "cs.ATG" +#line 1496 "cs.ATG" out stmt); Expect(11); -#line 1501 "cs.ATG" +#line 1496 "cs.ATG" compilationUnit.AddChild(stmt); } else if (StartOf(30)) { EmbeddedStatement( -#line 1503 "cs.ATG" +#line 1498 "cs.ATG" out stmt); -#line 1503 "cs.ATG" +#line 1498 "cs.ATG" compilationUnit.AddChild(stmt); } else SynErr(193); -#line 1509 "cs.ATG" +#line 1504 "cs.ATG" if (stmt != null) { stmt.StartLocation = startPos; stmt.EndLocation = t.EndLocation; @@ -3315,10 +3310,10 @@ out stmt); } void Argument( -#line 1378 "cs.ATG" +#line 1373 "cs.ATG" out Expression argumentexpr) { -#line 1380 "cs.ATG" +#line 1375 "cs.ATG" Expression expr; FieldDirection fd = FieldDirection.None; @@ -3326,51 +3321,51 @@ out Expression argumentexpr) { if (la.kind == 100) { lexer.NextToken(); -#line 1385 "cs.ATG" +#line 1380 "cs.ATG" fd = FieldDirection.Ref; } else { lexer.NextToken(); -#line 1386 "cs.ATG" +#line 1381 "cs.ATG" fd = FieldDirection.Out; } } Expr( -#line 1388 "cs.ATG" +#line 1383 "cs.ATG" out expr); -#line 1389 "cs.ATG" +#line 1384 "cs.ATG" argumentexpr = fd != FieldDirection.None ? argumentexpr = new DirectionExpression(fd, expr) : expr; } void CollectionInitializer( -#line 1409 "cs.ATG" +#line 1404 "cs.ATG" out Expression outExpr) { -#line 1411 "cs.ATG" +#line 1406 "cs.ATG" Expression expr = null; CollectionInitializerExpression initializer = new CollectionInitializerExpression(); Expect(16); -#line 1415 "cs.ATG" +#line 1410 "cs.ATG" initializer.StartLocation = t.Location; if (StartOf(31)) { VariableInitializer( -#line 1416 "cs.ATG" +#line 1411 "cs.ATG" out expr); -#line 1417 "cs.ATG" +#line 1412 "cs.ATG" SafeAdd(initializer, initializer.CreateExpressions, expr); while ( -#line 1418 "cs.ATG" +#line 1413 "cs.ATG" NotFinalComma()) { Expect(14); VariableInitializer( -#line 1419 "cs.ATG" +#line 1414 "cs.ATG" out expr); -#line 1420 "cs.ATG" +#line 1415 "cs.ATG" SafeAdd(initializer, initializer.CreateExpressions, expr); } if (la.kind == 14) { @@ -3379,105 +3374,105 @@ out expr); } Expect(17); -#line 1424 "cs.ATG" +#line 1419 "cs.ATG" initializer.EndLocation = t.Location; outExpr = initializer; } void AssignmentOperator( -#line 1392 "cs.ATG" +#line 1387 "cs.ATG" out AssignmentOperatorType op) { -#line 1393 "cs.ATG" +#line 1388 "cs.ATG" op = AssignmentOperatorType.None; if (la.kind == 3) { lexer.NextToken(); -#line 1395 "cs.ATG" +#line 1390 "cs.ATG" op = AssignmentOperatorType.Assign; } else if (la.kind == 38) { lexer.NextToken(); -#line 1396 "cs.ATG" +#line 1391 "cs.ATG" op = AssignmentOperatorType.Add; } else if (la.kind == 39) { lexer.NextToken(); -#line 1397 "cs.ATG" +#line 1392 "cs.ATG" op = AssignmentOperatorType.Subtract; } else if (la.kind == 40) { lexer.NextToken(); -#line 1398 "cs.ATG" +#line 1393 "cs.ATG" op = AssignmentOperatorType.Multiply; } else if (la.kind == 41) { lexer.NextToken(); -#line 1399 "cs.ATG" +#line 1394 "cs.ATG" op = AssignmentOperatorType.Divide; } else if (la.kind == 42) { lexer.NextToken(); -#line 1400 "cs.ATG" +#line 1395 "cs.ATG" op = AssignmentOperatorType.Modulus; } else if (la.kind == 43) { lexer.NextToken(); -#line 1401 "cs.ATG" +#line 1396 "cs.ATG" op = AssignmentOperatorType.BitwiseAnd; } else if (la.kind == 44) { lexer.NextToken(); -#line 1402 "cs.ATG" +#line 1397 "cs.ATG" op = AssignmentOperatorType.BitwiseOr; } else if (la.kind == 45) { lexer.NextToken(); -#line 1403 "cs.ATG" +#line 1398 "cs.ATG" op = AssignmentOperatorType.ExclusiveOr; } else if (la.kind == 46) { lexer.NextToken(); -#line 1404 "cs.ATG" +#line 1399 "cs.ATG" op = AssignmentOperatorType.ShiftLeft; } else if ( -#line 1405 "cs.ATG" +#line 1400 "cs.ATG" la.kind == Tokens.GreaterThan && Peek(1).kind == Tokens.GreaterEqual) { Expect(22); Expect(35); -#line 1406 "cs.ATG" +#line 1401 "cs.ATG" op = AssignmentOperatorType.ShiftRight; } else SynErr(194); } void CollectionOrObjectInitializer( -#line 1427 "cs.ATG" +#line 1422 "cs.ATG" out Expression outExpr) { -#line 1429 "cs.ATG" +#line 1424 "cs.ATG" Expression expr = null; CollectionInitializerExpression initializer = new CollectionInitializerExpression(); Expect(16); -#line 1433 "cs.ATG" +#line 1428 "cs.ATG" initializer.StartLocation = t.Location; if (StartOf(31)) { ObjectPropertyInitializerOrVariableInitializer( -#line 1434 "cs.ATG" +#line 1429 "cs.ATG" out expr); -#line 1435 "cs.ATG" +#line 1430 "cs.ATG" SafeAdd(initializer, initializer.CreateExpressions, expr); while ( -#line 1436 "cs.ATG" +#line 1431 "cs.ATG" NotFinalComma()) { Expect(14); ObjectPropertyInitializerOrVariableInitializer( -#line 1437 "cs.ATG" +#line 1432 "cs.ATG" out expr); -#line 1438 "cs.ATG" +#line 1433 "cs.ATG" SafeAdd(initializer, initializer.CreateExpressions, expr); } if (la.kind == 14) { @@ -3486,280 +3481,280 @@ out expr); } Expect(17); -#line 1442 "cs.ATG" +#line 1437 "cs.ATG" initializer.EndLocation = t.Location; outExpr = initializer; } void ObjectPropertyInitializerOrVariableInitializer( -#line 1445 "cs.ATG" +#line 1440 "cs.ATG" out Expression expr) { -#line 1446 "cs.ATG" +#line 1441 "cs.ATG" expr = null; if ( -#line 1448 "cs.ATG" +#line 1443 "cs.ATG" IdentAndAsgn()) { Identifier(); -#line 1450 "cs.ATG" +#line 1445 "cs.ATG" NamedArgumentExpression nae = new NamedArgumentExpression(t.val, null); nae.StartLocation = t.Location; Expression r = null; Expect(3); if (la.kind == 16) { CollectionOrObjectInitializer( -#line 1454 "cs.ATG" +#line 1449 "cs.ATG" out r); } else if (StartOf(31)) { VariableInitializer( -#line 1455 "cs.ATG" +#line 1450 "cs.ATG" out r); } else SynErr(195); -#line 1456 "cs.ATG" +#line 1451 "cs.ATG" nae.Expression = r; nae.EndLocation = t.EndLocation; expr = nae; } else if (StartOf(31)) { VariableInitializer( -#line 1458 "cs.ATG" +#line 1453 "cs.ATG" out expr); } else SynErr(196); } void LocalVariableDecl( -#line 1462 "cs.ATG" +#line 1457 "cs.ATG" out Statement stmt) { -#line 1464 "cs.ATG" +#line 1459 "cs.ATG" TypeReference type; VariableDeclaration var = null; LocalVariableDeclaration localVariableDeclaration; Location startPos = la.Location; Type( -#line 1470 "cs.ATG" +#line 1465 "cs.ATG" out type); -#line 1470 "cs.ATG" +#line 1465 "cs.ATG" localVariableDeclaration = new LocalVariableDeclaration(type); localVariableDeclaration.StartLocation = startPos; LocalVariableDeclarator( -#line 1471 "cs.ATG" +#line 1466 "cs.ATG" out var); -#line 1471 "cs.ATG" +#line 1466 "cs.ATG" SafeAdd(localVariableDeclaration, localVariableDeclaration.Variables, var); while (la.kind == 14) { lexer.NextToken(); LocalVariableDeclarator( -#line 1472 "cs.ATG" +#line 1467 "cs.ATG" out var); -#line 1472 "cs.ATG" +#line 1467 "cs.ATG" SafeAdd(localVariableDeclaration, localVariableDeclaration.Variables, var); } -#line 1473 "cs.ATG" +#line 1468 "cs.ATG" stmt = localVariableDeclaration; stmt.EndLocation = t.EndLocation; } void LocalVariableDeclarator( -#line 1476 "cs.ATG" +#line 1471 "cs.ATG" out VariableDeclaration var) { -#line 1477 "cs.ATG" +#line 1472 "cs.ATG" Expression expr = null; Identifier(); -#line 1479 "cs.ATG" +#line 1474 "cs.ATG" var = new VariableDeclaration(t.val); var.StartLocation = t.Location; if (la.kind == 3) { lexer.NextToken(); VariableInitializer( -#line 1480 "cs.ATG" +#line 1475 "cs.ATG" out expr); -#line 1480 "cs.ATG" +#line 1475 "cs.ATG" var.Initializer = expr; } -#line 1481 "cs.ATG" +#line 1476 "cs.ATG" var.EndLocation = t.EndLocation; } void EmbeddedStatement( -#line 1516 "cs.ATG" +#line 1511 "cs.ATG" out Statement statement) { -#line 1518 "cs.ATG" +#line 1513 "cs.ATG" TypeReference type = null; Expression expr = null; Statement embeddedStatement = null; statement = null; -#line 1524 "cs.ATG" +#line 1519 "cs.ATG" Location startLocation = la.Location; if (la.kind == 16) { Block( -#line 1526 "cs.ATG" +#line 1521 "cs.ATG" out statement); } else if (la.kind == 11) { lexer.NextToken(); -#line 1529 "cs.ATG" +#line 1524 "cs.ATG" statement = new EmptyStatement(); } else if ( -#line 1532 "cs.ATG" +#line 1527 "cs.ATG" UnCheckedAndLBrace()) { -#line 1532 "cs.ATG" +#line 1527 "cs.ATG" Statement block; bool isChecked = true; if (la.kind == 58) { lexer.NextToken(); } else if (la.kind == 118) { lexer.NextToken(); -#line 1533 "cs.ATG" +#line 1528 "cs.ATG" isChecked = false; } else SynErr(197); Block( -#line 1534 "cs.ATG" +#line 1529 "cs.ATG" out block); -#line 1534 "cs.ATG" +#line 1529 "cs.ATG" statement = isChecked ? (Statement)new CheckedStatement(block) : (Statement)new UncheckedStatement(block); } else if (la.kind == 79) { IfStatement( -#line 1537 "cs.ATG" +#line 1532 "cs.ATG" out statement); } else if (la.kind == 110) { lexer.NextToken(); -#line 1539 "cs.ATG" +#line 1534 "cs.ATG" List switchSections = new List(); Expect(20); Expr( -#line 1540 "cs.ATG" +#line 1535 "cs.ATG" out expr); Expect(21); Expect(16); SwitchSections( -#line 1541 "cs.ATG" +#line 1536 "cs.ATG" switchSections); Expect(17); -#line 1543 "cs.ATG" +#line 1538 "cs.ATG" statement = new SwitchStatement(expr, switchSections); } else if (la.kind == 125) { lexer.NextToken(); Expect(20); Expr( -#line 1546 "cs.ATG" +#line 1541 "cs.ATG" out expr); Expect(21); EmbeddedStatement( -#line 1547 "cs.ATG" +#line 1542 "cs.ATG" out embeddedStatement); -#line 1548 "cs.ATG" +#line 1543 "cs.ATG" statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.Start); } else if (la.kind == 65) { lexer.NextToken(); EmbeddedStatement( -#line 1550 "cs.ATG" +#line 1545 "cs.ATG" out embeddedStatement); Expect(125); Expect(20); Expr( -#line 1551 "cs.ATG" +#line 1546 "cs.ATG" out expr); Expect(21); Expect(11); -#line 1552 "cs.ATG" +#line 1547 "cs.ATG" statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.End); } else if (la.kind == 76) { lexer.NextToken(); -#line 1554 "cs.ATG" +#line 1549 "cs.ATG" List initializer = null; List iterator = null; Expect(20); if (StartOf(6)) { ForInitializer( -#line 1555 "cs.ATG" +#line 1550 "cs.ATG" out initializer); } Expect(11); if (StartOf(6)) { Expr( -#line 1556 "cs.ATG" +#line 1551 "cs.ATG" out expr); } Expect(11); if (StartOf(6)) { ForIterator( -#line 1557 "cs.ATG" +#line 1552 "cs.ATG" out iterator); } Expect(21); EmbeddedStatement( -#line 1558 "cs.ATG" +#line 1553 "cs.ATG" out embeddedStatement); -#line 1559 "cs.ATG" +#line 1554 "cs.ATG" statement = new ForStatement(initializer, expr, iterator, embeddedStatement); } else if (la.kind == 77) { lexer.NextToken(); Expect(20); Type( -#line 1561 "cs.ATG" +#line 1556 "cs.ATG" out type); Identifier(); -#line 1561 "cs.ATG" +#line 1556 "cs.ATG" string varName = t.val; Expect(81); Expr( -#line 1562 "cs.ATG" +#line 1557 "cs.ATG" out expr); Expect(21); EmbeddedStatement( -#line 1563 "cs.ATG" +#line 1558 "cs.ATG" out embeddedStatement); -#line 1564 "cs.ATG" +#line 1559 "cs.ATG" statement = new ForeachStatement(type, varName , expr, embeddedStatement); } else if (la.kind == 53) { lexer.NextToken(); Expect(11); -#line 1567 "cs.ATG" +#line 1562 "cs.ATG" statement = new BreakStatement(); } else if (la.kind == 61) { lexer.NextToken(); Expect(11); -#line 1568 "cs.ATG" +#line 1563 "cs.ATG" statement = new ContinueStatement(); } else if (la.kind == 78) { GotoStatement( -#line 1569 "cs.ATG" +#line 1564 "cs.ATG" out statement); } else if ( -#line 1571 "cs.ATG" +#line 1566 "cs.ATG" IsYieldStatement()) { Expect(132); if (la.kind == 101) { lexer.NextToken(); Expr( -#line 1572 "cs.ATG" +#line 1567 "cs.ATG" out expr); -#line 1572 "cs.ATG" +#line 1567 "cs.ATG" statement = new YieldStatement(new ReturnStatement(expr)); } else if (la.kind == 53) { lexer.NextToken(); -#line 1573 "cs.ATG" +#line 1568 "cs.ATG" statement = new YieldStatement(new BreakStatement()); } else SynErr(198); Expect(11); @@ -3767,90 +3762,90 @@ out expr); lexer.NextToken(); if (StartOf(6)) { Expr( -#line 1576 "cs.ATG" +#line 1571 "cs.ATG" out expr); } Expect(11); -#line 1576 "cs.ATG" +#line 1571 "cs.ATG" statement = new ReturnStatement(expr); } else if (la.kind == 112) { lexer.NextToken(); if (StartOf(6)) { Expr( -#line 1577 "cs.ATG" +#line 1572 "cs.ATG" out expr); } Expect(11); -#line 1577 "cs.ATG" +#line 1572 "cs.ATG" statement = new ThrowStatement(expr); } else if (StartOf(6)) { StatementExpr( -#line 1580 "cs.ATG" +#line 1575 "cs.ATG" out statement); while (!(la.kind == 0 || la.kind == 11)) {SynErr(199); lexer.NextToken(); } Expect(11); } else if (la.kind == 114) { TryStatement( -#line 1583 "cs.ATG" +#line 1578 "cs.ATG" out statement); } else if (la.kind == 86) { lexer.NextToken(); Expect(20); Expr( -#line 1586 "cs.ATG" +#line 1581 "cs.ATG" out expr); Expect(21); EmbeddedStatement( -#line 1587 "cs.ATG" +#line 1582 "cs.ATG" out embeddedStatement); -#line 1587 "cs.ATG" +#line 1582 "cs.ATG" statement = new LockStatement(expr, embeddedStatement); } else if (la.kind == 121) { -#line 1590 "cs.ATG" +#line 1585 "cs.ATG" Statement resourceAcquisitionStmt = null; lexer.NextToken(); Expect(20); ResourceAcquisition( -#line 1592 "cs.ATG" +#line 1587 "cs.ATG" out resourceAcquisitionStmt); Expect(21); EmbeddedStatement( -#line 1593 "cs.ATG" +#line 1588 "cs.ATG" out embeddedStatement); -#line 1593 "cs.ATG" +#line 1588 "cs.ATG" statement = new UsingStatement(resourceAcquisitionStmt, embeddedStatement); } else if (la.kind == 119) { lexer.NextToken(); Block( -#line 1596 "cs.ATG" +#line 1591 "cs.ATG" out embeddedStatement); -#line 1596 "cs.ATG" +#line 1591 "cs.ATG" statement = new UnsafeStatement(embeddedStatement); } else if (la.kind == 74) { -#line 1598 "cs.ATG" +#line 1593 "cs.ATG" Statement pointerDeclarationStmt = null; lexer.NextToken(); Expect(20); ResourceAcquisition( -#line 1600 "cs.ATG" +#line 1595 "cs.ATG" out pointerDeclarationStmt); Expect(21); EmbeddedStatement( -#line 1601 "cs.ATG" +#line 1596 "cs.ATG" out embeddedStatement); -#line 1601 "cs.ATG" +#line 1596 "cs.ATG" statement = new FixedStatement(pointerDeclarationStmt, embeddedStatement); } else SynErr(200); -#line 1603 "cs.ATG" +#line 1598 "cs.ATG" if (statement != null) { statement.StartLocation = startLocation; statement.EndLocation = t.EndLocation; @@ -3859,10 +3854,10 @@ out embeddedStatement); } void IfStatement( -#line 1610 "cs.ATG" +#line 1605 "cs.ATG" out Statement statement) { -#line 1612 "cs.ATG" +#line 1607 "cs.ATG" Expression expr = null; Statement embeddedStatement = null; statement = null; @@ -3870,26 +3865,26 @@ out Statement statement) { Expect(79); Expect(20); Expr( -#line 1618 "cs.ATG" +#line 1613 "cs.ATG" out expr); Expect(21); EmbeddedStatement( -#line 1619 "cs.ATG" +#line 1614 "cs.ATG" out embeddedStatement); -#line 1620 "cs.ATG" +#line 1615 "cs.ATG" Statement elseStatement = null; if (la.kind == 67) { lexer.NextToken(); EmbeddedStatement( -#line 1621 "cs.ATG" +#line 1616 "cs.ATG" out elseStatement); } -#line 1622 "cs.ATG" +#line 1617 "cs.ATG" statement = elseStatement != null ? new IfElseStatement(expr, embeddedStatement, elseStatement) : new IfElseStatement(expr, embeddedStatement); -#line 1623 "cs.ATG" +#line 1618 "cs.ATG" if (elseStatement is IfElseStatement && (elseStatement as IfElseStatement).TrueStatement.Count == 1) { /* else if-section (otherwise we would have a BlockStatment) */ (statement as IfElseStatement).ElseIfSections.Add( @@ -3902,29 +3897,29 @@ out elseStatement); } void SwitchSections( -#line 1653 "cs.ATG" +#line 1648 "cs.ATG" List switchSections) { -#line 1655 "cs.ATG" +#line 1650 "cs.ATG" SwitchSection switchSection = new SwitchSection(); CaseLabel label; SwitchLabel( -#line 1659 "cs.ATG" +#line 1654 "cs.ATG" out label); -#line 1659 "cs.ATG" +#line 1654 "cs.ATG" SafeAdd(switchSection, switchSection.SwitchLabels, label); -#line 1660 "cs.ATG" +#line 1655 "cs.ATG" compilationUnit.BlockStart(switchSection); while (StartOf(32)) { if (la.kind == 55 || la.kind == 63) { SwitchLabel( -#line 1662 "cs.ATG" +#line 1657 "cs.ATG" out label); -#line 1663 "cs.ATG" +#line 1658 "cs.ATG" if (label != null) { if (switchSection.Children.Count > 0) { // open new section @@ -3940,145 +3935,145 @@ out label); } } -#line 1675 "cs.ATG" +#line 1670 "cs.ATG" compilationUnit.BlockEnd(); switchSections.Add(switchSection); } void ForInitializer( -#line 1634 "cs.ATG" +#line 1629 "cs.ATG" out List initializer) { -#line 1636 "cs.ATG" +#line 1631 "cs.ATG" Statement stmt; initializer = new List(); if ( -#line 1640 "cs.ATG" +#line 1635 "cs.ATG" IsLocalVarDecl()) { LocalVariableDecl( -#line 1640 "cs.ATG" +#line 1635 "cs.ATG" out stmt); -#line 1640 "cs.ATG" +#line 1635 "cs.ATG" initializer.Add(stmt); } else if (StartOf(6)) { StatementExpr( -#line 1641 "cs.ATG" +#line 1636 "cs.ATG" out stmt); -#line 1641 "cs.ATG" +#line 1636 "cs.ATG" initializer.Add(stmt); while (la.kind == 14) { lexer.NextToken(); StatementExpr( -#line 1641 "cs.ATG" +#line 1636 "cs.ATG" out stmt); -#line 1641 "cs.ATG" +#line 1636 "cs.ATG" initializer.Add(stmt); } } else SynErr(201); } void ForIterator( -#line 1644 "cs.ATG" +#line 1639 "cs.ATG" out List iterator) { -#line 1646 "cs.ATG" +#line 1641 "cs.ATG" Statement stmt; iterator = new List(); StatementExpr( -#line 1650 "cs.ATG" +#line 1645 "cs.ATG" out stmt); -#line 1650 "cs.ATG" +#line 1645 "cs.ATG" iterator.Add(stmt); while (la.kind == 14) { lexer.NextToken(); StatementExpr( -#line 1650 "cs.ATG" +#line 1645 "cs.ATG" out stmt); -#line 1650 "cs.ATG" +#line 1645 "cs.ATG" iterator.Add(stmt); } } void GotoStatement( -#line 1732 "cs.ATG" +#line 1727 "cs.ATG" out Statement stmt) { -#line 1733 "cs.ATG" +#line 1728 "cs.ATG" Expression expr; stmt = null; Expect(78); if (StartOf(19)) { Identifier(); -#line 1737 "cs.ATG" +#line 1732 "cs.ATG" stmt = new GotoStatement(t.val); Expect(11); } else if (la.kind == 55) { lexer.NextToken(); Expr( -#line 1738 "cs.ATG" +#line 1733 "cs.ATG" out expr); Expect(11); -#line 1738 "cs.ATG" +#line 1733 "cs.ATG" stmt = new GotoCaseStatement(expr); } else if (la.kind == 63) { lexer.NextToken(); Expect(11); -#line 1739 "cs.ATG" +#line 1734 "cs.ATG" stmt = new GotoCaseStatement(null); } else SynErr(202); } void StatementExpr( -#line 1759 "cs.ATG" +#line 1754 "cs.ATG" out Statement stmt) { -#line 1760 "cs.ATG" +#line 1755 "cs.ATG" Expression expr; Expr( -#line 1762 "cs.ATG" +#line 1757 "cs.ATG" out expr); -#line 1765 "cs.ATG" +#line 1760 "cs.ATG" stmt = new ExpressionStatement(expr); } void TryStatement( -#line 1685 "cs.ATG" +#line 1680 "cs.ATG" out Statement tryStatement) { -#line 1687 "cs.ATG" +#line 1682 "cs.ATG" Statement blockStmt = null, finallyStmt = null; CatchClause catchClause = null; List catchClauses = new List(); Expect(114); Block( -#line 1692 "cs.ATG" +#line 1687 "cs.ATG" out blockStmt); while (la.kind == 56) { CatchClause( -#line 1694 "cs.ATG" +#line 1689 "cs.ATG" out catchClause); -#line 1695 "cs.ATG" +#line 1690 "cs.ATG" if (catchClause != null) catchClauses.Add(catchClause); } if (la.kind == 73) { lexer.NextToken(); Block( -#line 1697 "cs.ATG" +#line 1692 "cs.ATG" out finallyStmt); } -#line 1699 "cs.ATG" +#line 1694 "cs.ATG" tryStatement = new TryCatchStatement(blockStmt, catchClauses, finallyStmt); if (catchClauses != null) { foreach (CatchClause cc in catchClauses) cc.Parent = tryStatement; @@ -4087,59 +4082,59 @@ out finallyStmt); } void ResourceAcquisition( -#line 1743 "cs.ATG" +#line 1738 "cs.ATG" out Statement stmt) { -#line 1745 "cs.ATG" +#line 1740 "cs.ATG" stmt = null; Expression expr; if ( -#line 1750 "cs.ATG" +#line 1745 "cs.ATG" IsLocalVarDecl()) { LocalVariableDecl( -#line 1750 "cs.ATG" +#line 1745 "cs.ATG" out stmt); } else if (StartOf(6)) { Expr( -#line 1751 "cs.ATG" +#line 1746 "cs.ATG" out expr); -#line 1755 "cs.ATG" +#line 1750 "cs.ATG" stmt = new ExpressionStatement(expr); } else SynErr(203); } void SwitchLabel( -#line 1678 "cs.ATG" +#line 1673 "cs.ATG" out CaseLabel label) { -#line 1679 "cs.ATG" +#line 1674 "cs.ATG" Expression expr = null; label = null; if (la.kind == 55) { lexer.NextToken(); Expr( -#line 1681 "cs.ATG" +#line 1676 "cs.ATG" out expr); Expect(9); -#line 1681 "cs.ATG" +#line 1676 "cs.ATG" label = new CaseLabel(expr); } else if (la.kind == 63) { lexer.NextToken(); Expect(9); -#line 1682 "cs.ATG" +#line 1677 "cs.ATG" label = new CaseLabel(); } else SynErr(204); } void CatchClause( -#line 1706 "cs.ATG" +#line 1701 "cs.ATG" out CatchClause catchClause) { Expect(56); -#line 1708 "cs.ATG" +#line 1703 "cs.ATG" string identifier; Statement stmt; TypeReference typeRef; @@ -4148,35 +4143,35 @@ out CatchClause catchClause) { if (la.kind == 16) { Block( -#line 1716 "cs.ATG" +#line 1711 "cs.ATG" out stmt); -#line 1716 "cs.ATG" +#line 1711 "cs.ATG" catchClause = new CatchClause(stmt); } else if (la.kind == 20) { lexer.NextToken(); ClassType( -#line 1719 "cs.ATG" +#line 1714 "cs.ATG" out typeRef, false); -#line 1719 "cs.ATG" +#line 1714 "cs.ATG" identifier = null; if (StartOf(19)) { Identifier(); -#line 1720 "cs.ATG" +#line 1715 "cs.ATG" identifier = t.val; } Expect(21); Block( -#line 1721 "cs.ATG" +#line 1716 "cs.ATG" out stmt); -#line 1722 "cs.ATG" +#line 1717 "cs.ATG" catchClause = new CatchClause(typeRef, identifier, stmt); } else SynErr(205); -#line 1725 "cs.ATG" +#line 1720 "cs.ATG" if (catchClause != null) { catchClause.StartLocation = startPos; catchClause.EndLocation = t.Location; @@ -4185,75 +4180,75 @@ out stmt); } void UnaryExpr( -#line 1794 "cs.ATG" +#line 1789 "cs.ATG" out Expression uExpr) { -#line 1796 "cs.ATG" +#line 1791 "cs.ATG" TypeReference type = null; Expression expr = null; ArrayList expressions = new ArrayList(); uExpr = null; while (StartOf(33) || -#line 1818 "cs.ATG" +#line 1813 "cs.ATG" IsTypeCast()) { if (la.kind == 4) { lexer.NextToken(); -#line 1805 "cs.ATG" +#line 1800 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Plus)); } else if (la.kind == 5) { lexer.NextToken(); -#line 1806 "cs.ATG" +#line 1801 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Minus)); } else if (la.kind == 24) { lexer.NextToken(); -#line 1807 "cs.ATG" +#line 1802 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Not)); } else if (la.kind == 27) { lexer.NextToken(); -#line 1808 "cs.ATG" +#line 1803 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.BitNot)); } else if (la.kind == 6) { lexer.NextToken(); -#line 1809 "cs.ATG" +#line 1804 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Dereference)); } else if (la.kind == 31) { lexer.NextToken(); -#line 1810 "cs.ATG" +#line 1805 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Increment)); } else if (la.kind == 32) { lexer.NextToken(); -#line 1811 "cs.ATG" +#line 1806 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Decrement)); } else if (la.kind == 28) { lexer.NextToken(); -#line 1812 "cs.ATG" +#line 1807 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.AddressOf)); } else { Expect(20); Type( -#line 1818 "cs.ATG" +#line 1813 "cs.ATG" out type); Expect(21); -#line 1818 "cs.ATG" +#line 1813 "cs.ATG" expressions.Add(new CastExpression(type)); } } if ( -#line 1823 "cs.ATG" +#line 1818 "cs.ATG" LastExpressionIsUnaryMinus(expressions) && IsMostNegativeIntegerWithoutTypeSuffix()) { Expect(2); -#line 1826 "cs.ATG" +#line 1821 "cs.ATG" expressions.RemoveAt(expressions.Count - 1); if (t.literalValue is uint) { expr = new PrimitiveExpression(int.MinValue, int.MinValue.ToString()); @@ -4265,11 +4260,11 @@ LastExpressionIsUnaryMinus(expressions) && IsMostNegativeIntegerWithoutTypeSuffi } else if (StartOf(34)) { PrimaryExpr( -#line 1835 "cs.ATG" +#line 1830 "cs.ATG" out expr); } else SynErr(206); -#line 1837 "cs.ATG" +#line 1832 "cs.ATG" for (int i = 0; i < expressions.Count; ++i) { Expression nextExpression = i + 1 < expressions.Count ? (Expression)expressions[i + 1] : expr; if (expressions[i] is CastExpression) { @@ -4287,325 +4282,325 @@ out expr); } void ConditionalOrExpr( -#line 2161 "cs.ATG" +#line 2156 "cs.ATG" ref Expression outExpr) { -#line 2162 "cs.ATG" +#line 2157 "cs.ATG" Expression expr; ConditionalAndExpr( -#line 2164 "cs.ATG" +#line 2159 "cs.ATG" ref outExpr); while (la.kind == 26) { lexer.NextToken(); UnaryExpr( -#line 2164 "cs.ATG" +#line 2159 "cs.ATG" out expr); ConditionalAndExpr( -#line 2164 "cs.ATG" +#line 2159 "cs.ATG" ref expr); -#line 2164 "cs.ATG" +#line 2159 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.LogicalOr, expr); } } void PrimaryExpr( -#line 1854 "cs.ATG" +#line 1849 "cs.ATG" out Expression pexpr) { -#line 1856 "cs.ATG" +#line 1851 "cs.ATG" TypeReference type = null; Expression expr; pexpr = null; -#line 1861 "cs.ATG" +#line 1856 "cs.ATG" Location startLocation = la.Location; if (la.kind == 113) { lexer.NextToken(); -#line 1863 "cs.ATG" +#line 1858 "cs.ATG" pexpr = new PrimitiveExpression(true, "true"); } else if (la.kind == 72) { lexer.NextToken(); -#line 1864 "cs.ATG" +#line 1859 "cs.ATG" pexpr = new PrimitiveExpression(false, "false"); } else if (la.kind == 90) { lexer.NextToken(); -#line 1865 "cs.ATG" +#line 1860 "cs.ATG" pexpr = new PrimitiveExpression(null, "null"); } else if (la.kind == 2) { lexer.NextToken(); -#line 1866 "cs.ATG" +#line 1861 "cs.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val) { LiteralFormat = t.literalFormat }; } else if ( -#line 1867 "cs.ATG" +#line 1862 "cs.ATG" StartOfQueryExpression()) { QueryExpression( -#line 1868 "cs.ATG" +#line 1863 "cs.ATG" out pexpr); } else if ( -#line 1869 "cs.ATG" +#line 1864 "cs.ATG" IdentAndDoubleColon()) { Identifier(); -#line 1870 "cs.ATG" +#line 1865 "cs.ATG" type = new TypeReference(t.val); Expect(10); -#line 1871 "cs.ATG" +#line 1866 "cs.ATG" pexpr = new TypeReferenceExpression(type); Identifier(); -#line 1872 "cs.ATG" +#line 1867 "cs.ATG" if (type.Type == "global") { type.IsGlobal = true; type.Type = t.val ?? "?"; } else type.Type += "." + (t.val ?? "?"); } else if (StartOf(19)) { Identifier(); -#line 1876 "cs.ATG" +#line 1871 "cs.ATG" pexpr = new IdentifierExpression(t.val); if (la.kind == 48 || -#line 1879 "cs.ATG" +#line 1874 "cs.ATG" IsGenericInSimpleNameOrMemberAccess()) { if (la.kind == 48) { ShortedLambdaExpression( -#line 1878 "cs.ATG" +#line 1873 "cs.ATG" (IdentifierExpression)pexpr, out pexpr); } else { -#line 1880 "cs.ATG" +#line 1875 "cs.ATG" List typeList; TypeArgumentList( -#line 1881 "cs.ATG" +#line 1876 "cs.ATG" out typeList, false); -#line 1882 "cs.ATG" +#line 1877 "cs.ATG" ((IdentifierExpression)pexpr).TypeArguments = typeList; } } } else if ( -#line 1884 "cs.ATG" +#line 1879 "cs.ATG" IsLambdaExpression()) { LambdaExpression( -#line 1885 "cs.ATG" +#line 1880 "cs.ATG" out pexpr); } else if (la.kind == 20) { lexer.NextToken(); Expr( -#line 1888 "cs.ATG" +#line 1883 "cs.ATG" out expr); Expect(21); -#line 1888 "cs.ATG" +#line 1883 "cs.ATG" pexpr = new ParenthesizedExpression(expr); } else if (StartOf(35)) { -#line 1891 "cs.ATG" +#line 1886 "cs.ATG" string val = null; switch (la.kind) { case 52: { lexer.NextToken(); -#line 1892 "cs.ATG" +#line 1887 "cs.ATG" val = "System.Boolean"; break; } case 54: { lexer.NextToken(); -#line 1893 "cs.ATG" +#line 1888 "cs.ATG" val = "System.Byte"; break; } case 57: { lexer.NextToken(); -#line 1894 "cs.ATG" +#line 1889 "cs.ATG" val = "System.Char"; break; } case 62: { lexer.NextToken(); -#line 1895 "cs.ATG" +#line 1890 "cs.ATG" val = "System.Decimal"; break; } case 66: { lexer.NextToken(); -#line 1896 "cs.ATG" +#line 1891 "cs.ATG" val = "System.Double"; break; } case 75: { lexer.NextToken(); -#line 1897 "cs.ATG" +#line 1892 "cs.ATG" val = "System.Single"; break; } case 82: { lexer.NextToken(); -#line 1898 "cs.ATG" +#line 1893 "cs.ATG" val = "System.Int32"; break; } case 87: { lexer.NextToken(); -#line 1899 "cs.ATG" +#line 1894 "cs.ATG" val = "System.Int64"; break; } case 91: { lexer.NextToken(); -#line 1900 "cs.ATG" +#line 1895 "cs.ATG" val = "System.Object"; break; } case 102: { lexer.NextToken(); -#line 1901 "cs.ATG" +#line 1896 "cs.ATG" val = "System.SByte"; break; } case 104: { lexer.NextToken(); -#line 1902 "cs.ATG" +#line 1897 "cs.ATG" val = "System.Int16"; break; } case 108: { lexer.NextToken(); -#line 1903 "cs.ATG" +#line 1898 "cs.ATG" val = "System.String"; break; } case 116: { lexer.NextToken(); -#line 1904 "cs.ATG" +#line 1899 "cs.ATG" val = "System.UInt32"; break; } case 117: { lexer.NextToken(); -#line 1905 "cs.ATG" +#line 1900 "cs.ATG" val = "System.UInt64"; break; } case 120: { lexer.NextToken(); -#line 1906 "cs.ATG" +#line 1901 "cs.ATG" val = "System.UInt16"; break; } case 123: { lexer.NextToken(); -#line 1907 "cs.ATG" +#line 1902 "cs.ATG" val = "System.Void"; break; } } -#line 1909 "cs.ATG" +#line 1904 "cs.ATG" pexpr = new TypeReferenceExpression(new TypeReference(val, true)) { StartLocation = t.Location, EndLocation = t.EndLocation }; } else if (la.kind == 111) { lexer.NextToken(); -#line 1912 "cs.ATG" +#line 1907 "cs.ATG" pexpr = new ThisReferenceExpression(); pexpr.StartLocation = t.Location; pexpr.EndLocation = t.EndLocation; } else if (la.kind == 51) { lexer.NextToken(); -#line 1914 "cs.ATG" +#line 1909 "cs.ATG" pexpr = new BaseReferenceExpression(); pexpr.StartLocation = t.Location; pexpr.EndLocation = t.EndLocation; } else if (la.kind == 89) { NewExpression( -#line 1917 "cs.ATG" +#line 1912 "cs.ATG" out pexpr); } else if (la.kind == 115) { lexer.NextToken(); Expect(20); if ( -#line 1921 "cs.ATG" +#line 1916 "cs.ATG" NotVoidPointer()) { Expect(123); -#line 1921 "cs.ATG" +#line 1916 "cs.ATG" type = new TypeReference("System.Void", true); } else if (StartOf(10)) { TypeWithRestriction( -#line 1922 "cs.ATG" +#line 1917 "cs.ATG" out type, true, true); } else SynErr(207); Expect(21); -#line 1924 "cs.ATG" +#line 1919 "cs.ATG" pexpr = new TypeOfExpression(type); } else if (la.kind == 63) { lexer.NextToken(); Expect(20); Type( -#line 1926 "cs.ATG" +#line 1921 "cs.ATG" out type); Expect(21); -#line 1926 "cs.ATG" +#line 1921 "cs.ATG" pexpr = new DefaultValueExpression(type); } else if (la.kind == 105) { lexer.NextToken(); Expect(20); Type( -#line 1927 "cs.ATG" +#line 1922 "cs.ATG" out type); Expect(21); -#line 1927 "cs.ATG" +#line 1922 "cs.ATG" pexpr = new SizeOfExpression(type); } else if (la.kind == 58) { lexer.NextToken(); Expect(20); Expr( -#line 1928 "cs.ATG" +#line 1923 "cs.ATG" out expr); Expect(21); -#line 1928 "cs.ATG" +#line 1923 "cs.ATG" pexpr = new CheckedExpression(expr); } else if (la.kind == 118) { lexer.NextToken(); Expect(20); Expr( -#line 1929 "cs.ATG" +#line 1924 "cs.ATG" out expr); Expect(21); -#line 1929 "cs.ATG" +#line 1924 "cs.ATG" pexpr = new UncheckedExpression(expr); } else if (la.kind == 64) { lexer.NextToken(); AnonymousMethodExpr( -#line 1930 "cs.ATG" +#line 1925 "cs.ATG" out expr); -#line 1930 "cs.ATG" +#line 1925 "cs.ATG" pexpr = expr; } else SynErr(208); -#line 1932 "cs.ATG" +#line 1927 "cs.ATG" if (pexpr != null) { if (pexpr.StartLocation.IsEmpty) pexpr.StartLocation = startLocation; @@ -4615,57 +4610,57 @@ out expr); while (StartOf(36)) { -#line 1940 "cs.ATG" +#line 1935 "cs.ATG" startLocation = la.Location; switch (la.kind) { case 31: { lexer.NextToken(); -#line 1942 "cs.ATG" +#line 1937 "cs.ATG" pexpr = new UnaryOperatorExpression(pexpr, UnaryOperatorType.PostIncrement); break; } case 32: { lexer.NextToken(); -#line 1944 "cs.ATG" +#line 1939 "cs.ATG" pexpr = new UnaryOperatorExpression(pexpr, UnaryOperatorType.PostDecrement); break; } case 47: { PointerMemberAccess( -#line 1946 "cs.ATG" +#line 1941 "cs.ATG" out pexpr, pexpr); break; } case 15: { MemberAccess( -#line 1947 "cs.ATG" +#line 1942 "cs.ATG" out pexpr, pexpr); break; } case 20: { lexer.NextToken(); -#line 1951 "cs.ATG" +#line 1946 "cs.ATG" List parameters = new List(); -#line 1952 "cs.ATG" +#line 1947 "cs.ATG" pexpr = new InvocationExpression(pexpr, parameters); if (StartOf(26)) { Argument( -#line 1953 "cs.ATG" +#line 1948 "cs.ATG" out expr); -#line 1953 "cs.ATG" +#line 1948 "cs.ATG" SafeAdd(pexpr, parameters, expr); while (la.kind == 14) { lexer.NextToken(); Argument( -#line 1954 "cs.ATG" +#line 1949 "cs.ATG" out expr); -#line 1954 "cs.ATG" +#line 1949 "cs.ATG" SafeAdd(pexpr, parameters, expr); } } @@ -4674,24 +4669,24 @@ out expr); } case 18: { -#line 1960 "cs.ATG" +#line 1955 "cs.ATG" List indices = new List(); pexpr = new IndexerExpression(pexpr, indices); lexer.NextToken(); Expr( -#line 1963 "cs.ATG" +#line 1958 "cs.ATG" out expr); -#line 1963 "cs.ATG" +#line 1958 "cs.ATG" SafeAdd(pexpr, indices, expr); while (la.kind == 14) { lexer.NextToken(); Expr( -#line 1964 "cs.ATG" +#line 1959 "cs.ATG" out expr); -#line 1964 "cs.ATG" +#line 1959 "cs.ATG" SafeAdd(pexpr, indices, expr); } Expect(19); @@ -4699,7 +4694,7 @@ out expr); } } -#line 1967 "cs.ATG" +#line 1962 "cs.ATG" if (pexpr != null) { if (pexpr.StartLocation.IsEmpty) pexpr.StartLocation = startLocation; @@ -4711,83 +4706,83 @@ out expr); } void QueryExpression( -#line 2399 "cs.ATG" +#line 2394 "cs.ATG" out Expression outExpr) { -#line 2400 "cs.ATG" +#line 2395 "cs.ATG" QueryExpression q = new QueryExpression(); outExpr = q; q.StartLocation = la.Location; QueryExpressionFromClause fromClause; QueryExpressionFromClause( -#line 2404 "cs.ATG" +#line 2399 "cs.ATG" out fromClause); -#line 2404 "cs.ATG" +#line 2399 "cs.ATG" q.FromClause = fromClause; QueryExpressionBody( -#line 2405 "cs.ATG" +#line 2400 "cs.ATG" ref q); -#line 2406 "cs.ATG" +#line 2401 "cs.ATG" q.EndLocation = t.EndLocation; outExpr = q; /* set outExpr to q again if QueryExpressionBody changed it (can happen with 'into' clauses) */ } void ShortedLambdaExpression( -#line 2081 "cs.ATG" +#line 2076 "cs.ATG" IdentifierExpression ident, out Expression pexpr) { -#line 2082 "cs.ATG" +#line 2077 "cs.ATG" LambdaExpression lambda = new LambdaExpression(); pexpr = lambda; Expect(48); -#line 2087 "cs.ATG" +#line 2082 "cs.ATG" lambda.StartLocation = ident.StartLocation; SafeAdd(lambda, lambda.Parameters, new ParameterDeclarationExpression(null, ident.Identifier)); lambda.Parameters[0].StartLocation = ident.StartLocation; lambda.Parameters[0].EndLocation = ident.EndLocation; LambdaExpressionBody( -#line 2092 "cs.ATG" +#line 2087 "cs.ATG" lambda); } void TypeArgumentList( -#line 2333 "cs.ATG" +#line 2328 "cs.ATG" out List types, bool canBeUnbound) { -#line 2335 "cs.ATG" +#line 2330 "cs.ATG" types = new List(); TypeReference type = null; Expect(23); if ( -#line 2340 "cs.ATG" +#line 2335 "cs.ATG" canBeUnbound && (la.kind == Tokens.GreaterThan || la.kind == Tokens.Comma)) { -#line 2341 "cs.ATG" +#line 2336 "cs.ATG" types.Add(TypeReference.Null); while (la.kind == 14) { lexer.NextToken(); -#line 2342 "cs.ATG" +#line 2337 "cs.ATG" types.Add(TypeReference.Null); } } else if (StartOf(10)) { Type( -#line 2343 "cs.ATG" +#line 2338 "cs.ATG" out type); -#line 2343 "cs.ATG" +#line 2338 "cs.ATG" if (type != null) { types.Add(type); } while (la.kind == 14) { lexer.NextToken(); Type( -#line 2344 "cs.ATG" +#line 2339 "cs.ATG" out type); -#line 2344 "cs.ATG" +#line 2339 "cs.ATG" if (type != null) { types.Add(type); } } } else SynErr(209); @@ -4795,10 +4790,10 @@ out type); } void LambdaExpression( -#line 2061 "cs.ATG" +#line 2056 "cs.ATG" out Expression outExpr) { -#line 2063 "cs.ATG" +#line 2058 "cs.ATG" LambdaExpression lambda = new LambdaExpression(); lambda.StartLocation = la.Location; ParameterDeclarationExpression p; @@ -4807,33 +4802,33 @@ out Expression outExpr) { Expect(20); if (StartOf(18)) { LambdaExpressionParameter( -#line 2071 "cs.ATG" +#line 2066 "cs.ATG" out p); -#line 2071 "cs.ATG" +#line 2066 "cs.ATG" SafeAdd(lambda, lambda.Parameters, p); while (la.kind == 14) { lexer.NextToken(); LambdaExpressionParameter( -#line 2073 "cs.ATG" +#line 2068 "cs.ATG" out p); -#line 2073 "cs.ATG" +#line 2068 "cs.ATG" SafeAdd(lambda, lambda.Parameters, p); } } Expect(21); Expect(48); LambdaExpressionBody( -#line 2078 "cs.ATG" +#line 2073 "cs.ATG" lambda); } void NewExpression( -#line 2008 "cs.ATG" +#line 2003 "cs.ATG" out Expression pexpr) { -#line 2009 "cs.ATG" +#line 2004 "cs.ATG" pexpr = null; List parameters = new List(); TypeReference type = null; @@ -4842,65 +4837,65 @@ out Expression pexpr) { Expect(89); if (StartOf(10)) { NonArrayType( -#line 2016 "cs.ATG" +#line 2011 "cs.ATG" out type); } if (la.kind == 16 || la.kind == 20) { if (la.kind == 20) { -#line 2022 "cs.ATG" +#line 2017 "cs.ATG" ObjectCreateExpression oce = new ObjectCreateExpression(type, parameters); lexer.NextToken(); -#line 2023 "cs.ATG" +#line 2018 "cs.ATG" if (type == null) Error("Cannot use an anonymous type with arguments for the constructor"); if (StartOf(26)) { Argument( -#line 2024 "cs.ATG" +#line 2019 "cs.ATG" out expr); -#line 2024 "cs.ATG" +#line 2019 "cs.ATG" SafeAdd(oce, parameters, expr); while (la.kind == 14) { lexer.NextToken(); Argument( -#line 2025 "cs.ATG" +#line 2020 "cs.ATG" out expr); -#line 2025 "cs.ATG" +#line 2020 "cs.ATG" SafeAdd(oce, parameters, expr); } } Expect(21); -#line 2027 "cs.ATG" +#line 2022 "cs.ATG" pexpr = oce; if (la.kind == 16) { CollectionOrObjectInitializer( -#line 2028 "cs.ATG" +#line 2023 "cs.ATG" out expr); -#line 2028 "cs.ATG" +#line 2023 "cs.ATG" oce.ObjectInitializer = (CollectionInitializerExpression)expr; } } else { -#line 2029 "cs.ATG" +#line 2024 "cs.ATG" ObjectCreateExpression oce = new ObjectCreateExpression(type, parameters); CollectionOrObjectInitializer( -#line 2030 "cs.ATG" +#line 2025 "cs.ATG" out expr); -#line 2030 "cs.ATG" +#line 2025 "cs.ATG" oce.ObjectInitializer = (CollectionInitializerExpression)expr; -#line 2031 "cs.ATG" +#line 2026 "cs.ATG" pexpr = oce; } } else if (la.kind == 18) { lexer.NextToken(); -#line 2036 "cs.ATG" +#line 2031 "cs.ATG" ArrayCreateExpression ace = new ArrayCreateExpression(type); /* we must not change RankSpecifier on the null type reference*/ if (ace.CreateType.IsNull) { ace.CreateType = new TypeReference(""); } @@ -4911,80 +4906,80 @@ out expr); while (la.kind == 14) { lexer.NextToken(); -#line 2043 "cs.ATG" +#line 2038 "cs.ATG" dims += 1; } Expect(19); -#line 2044 "cs.ATG" +#line 2039 "cs.ATG" ranks.Add(dims); dims = 0; while (la.kind == 18) { lexer.NextToken(); while (la.kind == 14) { lexer.NextToken(); -#line 2045 "cs.ATG" +#line 2040 "cs.ATG" ++dims; } Expect(19); -#line 2045 "cs.ATG" +#line 2040 "cs.ATG" ranks.Add(dims); dims = 0; } -#line 2046 "cs.ATG" +#line 2041 "cs.ATG" ace.CreateType.RankSpecifier = ranks.ToArray(); CollectionInitializer( -#line 2047 "cs.ATG" +#line 2042 "cs.ATG" out expr); -#line 2047 "cs.ATG" +#line 2042 "cs.ATG" ace.ArrayInitializer = (CollectionInitializerExpression)expr; } else if (StartOf(6)) { Expr( -#line 2048 "cs.ATG" +#line 2043 "cs.ATG" out expr); -#line 2048 "cs.ATG" +#line 2043 "cs.ATG" if (expr != null) parameters.Add(expr); while (la.kind == 14) { lexer.NextToken(); -#line 2049 "cs.ATG" +#line 2044 "cs.ATG" dims += 1; Expr( -#line 2050 "cs.ATG" +#line 2045 "cs.ATG" out expr); -#line 2050 "cs.ATG" +#line 2045 "cs.ATG" if (expr != null) parameters.Add(expr); } Expect(19); -#line 2052 "cs.ATG" +#line 2047 "cs.ATG" ranks.Add(dims); ace.Arguments = parameters; dims = 0; while (la.kind == 18) { lexer.NextToken(); while (la.kind == 14) { lexer.NextToken(); -#line 2053 "cs.ATG" +#line 2048 "cs.ATG" ++dims; } Expect(19); -#line 2053 "cs.ATG" +#line 2048 "cs.ATG" ranks.Add(dims); dims = 0; } -#line 2054 "cs.ATG" +#line 2049 "cs.ATG" ace.CreateType.RankSpecifier = ranks.ToArray(); if (la.kind == 16) { CollectionInitializer( -#line 2055 "cs.ATG" +#line 2050 "cs.ATG" out expr); -#line 2055 "cs.ATG" +#line 2050 "cs.ATG" ace.ArrayInitializer = (CollectionInitializerExpression)expr; } } else SynErr(210); @@ -4992,10 +4987,10 @@ out expr); } void AnonymousMethodExpr( -#line 2128 "cs.ATG" +#line 2123 "cs.ATG" out Expression outExpr) { -#line 2130 "cs.ATG" +#line 2125 "cs.ATG" AnonymousMethodExpression expr = new AnonymousMethodExpression(); expr.StartLocation = t.Location; BlockStatement stmt; @@ -5006,59 +5001,59 @@ out Expression outExpr) { lexer.NextToken(); if (StartOf(11)) { FormalParameterList( -#line 2139 "cs.ATG" +#line 2134 "cs.ATG" p); -#line 2139 "cs.ATG" +#line 2134 "cs.ATG" expr.Parameters = p; } Expect(21); -#line 2141 "cs.ATG" +#line 2136 "cs.ATG" expr.HasParameterList = true; } BlockInsideExpression( -#line 2143 "cs.ATG" +#line 2138 "cs.ATG" out stmt); -#line 2143 "cs.ATG" +#line 2138 "cs.ATG" expr.Body = stmt; -#line 2144 "cs.ATG" +#line 2139 "cs.ATG" expr.EndLocation = t.Location; } void PointerMemberAccess( -#line 1996 "cs.ATG" +#line 1991 "cs.ATG" out Expression expr, Expression target) { -#line 1997 "cs.ATG" +#line 1992 "cs.ATG" List typeList; Expect(47); Identifier(); -#line 2001 "cs.ATG" +#line 1996 "cs.ATG" expr = new PointerReferenceExpression(target, t.val); expr.StartLocation = t.Location; expr.EndLocation = t.EndLocation; if ( -#line 2002 "cs.ATG" +#line 1997 "cs.ATG" IsGenericInSimpleNameOrMemberAccess()) { TypeArgumentList( -#line 2003 "cs.ATG" +#line 1998 "cs.ATG" out typeList, false); -#line 2004 "cs.ATG" +#line 1999 "cs.ATG" ((MemberReferenceExpression)expr).TypeArguments = typeList; } } void MemberAccess( -#line 1977 "cs.ATG" +#line 1972 "cs.ATG" out Expression expr, Expression target) { -#line 1978 "cs.ATG" +#line 1973 "cs.ATG" List typeList; -#line 1980 "cs.ATG" +#line 1975 "cs.ATG" if (ShouldConvertTargetExpressionToTypeReference(target)) { TypeReference type = GetTypeReferenceFromExpression(target); if (type != null) { @@ -5068,39 +5063,39 @@ out Expression expr, Expression target) { Expect(15); -#line 1987 "cs.ATG" +#line 1982 "cs.ATG" Location startLocation = t.Location; Identifier(); -#line 1989 "cs.ATG" +#line 1984 "cs.ATG" expr = new MemberReferenceExpression(target, t.val); expr.StartLocation = startLocation; expr.EndLocation = t.EndLocation; if ( -#line 1990 "cs.ATG" +#line 1985 "cs.ATG" IsGenericInSimpleNameOrMemberAccess()) { TypeArgumentList( -#line 1991 "cs.ATG" +#line 1986 "cs.ATG" out typeList, false); -#line 1992 "cs.ATG" +#line 1987 "cs.ATG" ((MemberReferenceExpression)expr).TypeArguments = typeList; } } void LambdaExpressionParameter( -#line 2095 "cs.ATG" +#line 2090 "cs.ATG" out ParameterDeclarationExpression p) { -#line 2096 "cs.ATG" +#line 2091 "cs.ATG" Location start = la.Location; p = null; TypeReference type; ParameterModifiers mod = ParameterModifiers.In; if ( -#line 2101 "cs.ATG" +#line 2096 "cs.ATG" Peek(1).kind == Tokens.Comma || Peek(1).kind == Tokens.CloseParenthesis) { Identifier(); -#line 2103 "cs.ATG" +#line 2098 "cs.ATG" p = new ParameterDeclarationExpression(null, t.val); p.StartLocation = start; p.EndLocation = t.EndLocation; @@ -5109,21 +5104,21 @@ Peek(1).kind == Tokens.Comma || Peek(1).kind == Tokens.CloseParenthesis) { if (la.kind == 100) { lexer.NextToken(); -#line 2106 "cs.ATG" +#line 2101 "cs.ATG" mod = ParameterModifiers.Ref; } else { lexer.NextToken(); -#line 2107 "cs.ATG" +#line 2102 "cs.ATG" mod = ParameterModifiers.Out; } } Type( -#line 2109 "cs.ATG" +#line 2104 "cs.ATG" out type); Identifier(); -#line 2111 "cs.ATG" +#line 2106 "cs.ATG" p = new ParameterDeclarationExpression(type, t.val, mod); p.StartLocation = start; p.EndLocation = t.EndLocation; @@ -5131,263 +5126,263 @@ out type); } void LambdaExpressionBody( -#line 2117 "cs.ATG" +#line 2112 "cs.ATG" LambdaExpression lambda) { -#line 2118 "cs.ATG" +#line 2113 "cs.ATG" Expression expr; BlockStatement stmt; if (la.kind == 16) { BlockInsideExpression( -#line 2121 "cs.ATG" +#line 2116 "cs.ATG" out stmt); -#line 2121 "cs.ATG" +#line 2116 "cs.ATG" lambda.StatementBody = stmt; } else if (StartOf(6)) { Expr( -#line 2122 "cs.ATG" +#line 2117 "cs.ATG" out expr); -#line 2122 "cs.ATG" +#line 2117 "cs.ATG" lambda.ExpressionBody = expr; } else SynErr(213); -#line 2124 "cs.ATG" +#line 2119 "cs.ATG" lambda.EndLocation = t.EndLocation; -#line 2125 "cs.ATG" +#line 2120 "cs.ATG" lambda.ExtendedEndLocation = la.Location; } void BlockInsideExpression( -#line 2147 "cs.ATG" +#line 2142 "cs.ATG" out BlockStatement outStmt) { -#line 2148 "cs.ATG" +#line 2143 "cs.ATG" Statement stmt = null; outStmt = null; -#line 2152 "cs.ATG" +#line 2147 "cs.ATG" if (compilationUnit != null) { Block( -#line 2153 "cs.ATG" +#line 2148 "cs.ATG" out stmt); -#line 2153 "cs.ATG" +#line 2148 "cs.ATG" outStmt = (BlockStatement)stmt; -#line 2154 "cs.ATG" +#line 2149 "cs.ATG" } else { Expect(16); -#line 2156 "cs.ATG" +#line 2151 "cs.ATG" lexer.SkipCurrentBlock(0); Expect(17); -#line 2158 "cs.ATG" +#line 2153 "cs.ATG" } } void ConditionalAndExpr( -#line 2167 "cs.ATG" +#line 2162 "cs.ATG" ref Expression outExpr) { -#line 2168 "cs.ATG" +#line 2163 "cs.ATG" Expression expr; InclusiveOrExpr( -#line 2170 "cs.ATG" +#line 2165 "cs.ATG" ref outExpr); while (la.kind == 25) { lexer.NextToken(); UnaryExpr( -#line 2170 "cs.ATG" +#line 2165 "cs.ATG" out expr); InclusiveOrExpr( -#line 2170 "cs.ATG" +#line 2165 "cs.ATG" ref expr); -#line 2170 "cs.ATG" +#line 2165 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.LogicalAnd, expr); } } void InclusiveOrExpr( -#line 2173 "cs.ATG" +#line 2168 "cs.ATG" ref Expression outExpr) { -#line 2174 "cs.ATG" +#line 2169 "cs.ATG" Expression expr; ExclusiveOrExpr( -#line 2176 "cs.ATG" +#line 2171 "cs.ATG" ref outExpr); while (la.kind == 29) { lexer.NextToken(); UnaryExpr( -#line 2176 "cs.ATG" +#line 2171 "cs.ATG" out expr); ExclusiveOrExpr( -#line 2176 "cs.ATG" +#line 2171 "cs.ATG" ref expr); -#line 2176 "cs.ATG" +#line 2171 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.BitwiseOr, expr); } } void ExclusiveOrExpr( -#line 2179 "cs.ATG" +#line 2174 "cs.ATG" ref Expression outExpr) { -#line 2180 "cs.ATG" +#line 2175 "cs.ATG" Expression expr; AndExpr( -#line 2182 "cs.ATG" +#line 2177 "cs.ATG" ref outExpr); while (la.kind == 30) { lexer.NextToken(); UnaryExpr( -#line 2182 "cs.ATG" +#line 2177 "cs.ATG" out expr); AndExpr( -#line 2182 "cs.ATG" +#line 2177 "cs.ATG" ref expr); -#line 2182 "cs.ATG" +#line 2177 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.ExclusiveOr, expr); } } void AndExpr( -#line 2185 "cs.ATG" +#line 2180 "cs.ATG" ref Expression outExpr) { -#line 2186 "cs.ATG" +#line 2181 "cs.ATG" Expression expr; EqualityExpr( -#line 2188 "cs.ATG" +#line 2183 "cs.ATG" ref outExpr); while (la.kind == 28) { lexer.NextToken(); UnaryExpr( -#line 2188 "cs.ATG" +#line 2183 "cs.ATG" out expr); EqualityExpr( -#line 2188 "cs.ATG" +#line 2183 "cs.ATG" ref expr); -#line 2188 "cs.ATG" +#line 2183 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.BitwiseAnd, expr); } } void EqualityExpr( -#line 2191 "cs.ATG" +#line 2186 "cs.ATG" ref Expression outExpr) { -#line 2193 "cs.ATG" +#line 2188 "cs.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; RelationalExpr( -#line 2197 "cs.ATG" +#line 2192 "cs.ATG" ref outExpr); while (la.kind == 33 || la.kind == 34) { if (la.kind == 34) { lexer.NextToken(); -#line 2200 "cs.ATG" +#line 2195 "cs.ATG" op = BinaryOperatorType.InEquality; } else { lexer.NextToken(); -#line 2201 "cs.ATG" +#line 2196 "cs.ATG" op = BinaryOperatorType.Equality; } UnaryExpr( -#line 2203 "cs.ATG" +#line 2198 "cs.ATG" out expr); RelationalExpr( -#line 2203 "cs.ATG" +#line 2198 "cs.ATG" ref expr); -#line 2203 "cs.ATG" +#line 2198 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void RelationalExpr( -#line 2207 "cs.ATG" +#line 2202 "cs.ATG" ref Expression outExpr) { -#line 2209 "cs.ATG" +#line 2204 "cs.ATG" TypeReference type; Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ShiftExpr( -#line 2214 "cs.ATG" +#line 2209 "cs.ATG" ref outExpr); while (StartOf(37)) { if (StartOf(38)) { if (la.kind == 23) { lexer.NextToken(); -#line 2216 "cs.ATG" +#line 2211 "cs.ATG" op = BinaryOperatorType.LessThan; } else if (la.kind == 22) { lexer.NextToken(); -#line 2217 "cs.ATG" +#line 2212 "cs.ATG" op = BinaryOperatorType.GreaterThan; } else if (la.kind == 36) { lexer.NextToken(); -#line 2218 "cs.ATG" +#line 2213 "cs.ATG" op = BinaryOperatorType.LessThanOrEqual; } else if (la.kind == 35) { lexer.NextToken(); -#line 2219 "cs.ATG" +#line 2214 "cs.ATG" op = BinaryOperatorType.GreaterThanOrEqual; } else SynErr(214); UnaryExpr( -#line 2221 "cs.ATG" +#line 2216 "cs.ATG" out expr); ShiftExpr( -#line 2222 "cs.ATG" +#line 2217 "cs.ATG" ref expr); -#line 2223 "cs.ATG" +#line 2218 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } else { if (la.kind == 85) { lexer.NextToken(); TypeWithRestriction( -#line 2226 "cs.ATG" +#line 2221 "cs.ATG" out type, false, false); if ( -#line 2227 "cs.ATG" +#line 2222 "cs.ATG" la.kind == Tokens.Question && !IsPossibleExpressionStart(Peek(1).kind)) { NullableQuestionMark( -#line 2228 "cs.ATG" +#line 2223 "cs.ATG" ref type); } -#line 2229 "cs.ATG" +#line 2224 "cs.ATG" outExpr = new TypeOfIsExpression(outExpr, type); } else if (la.kind == 50) { lexer.NextToken(); TypeWithRestriction( -#line 2231 "cs.ATG" +#line 2226 "cs.ATG" out type, false, false); if ( -#line 2232 "cs.ATG" +#line 2227 "cs.ATG" la.kind == Tokens.Question && !IsPossibleExpressionStart(Peek(1).kind)) { NullableQuestionMark( -#line 2233 "cs.ATG" +#line 2228 "cs.ATG" ref type); } -#line 2234 "cs.ATG" +#line 2229 "cs.ATG" outExpr = new CastExpression(type, outExpr, CastType.TryCast); } else SynErr(215); } @@ -5395,83 +5390,83 @@ ref type); } void ShiftExpr( -#line 2239 "cs.ATG" +#line 2234 "cs.ATG" ref Expression outExpr) { -#line 2241 "cs.ATG" +#line 2236 "cs.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; AdditiveExpr( -#line 2245 "cs.ATG" +#line 2240 "cs.ATG" ref outExpr); while (la.kind == 37 || -#line 2248 "cs.ATG" +#line 2243 "cs.ATG" IsShiftRight()) { if (la.kind == 37) { lexer.NextToken(); -#line 2247 "cs.ATG" +#line 2242 "cs.ATG" op = BinaryOperatorType.ShiftLeft; } else { Expect(22); Expect(22); -#line 2249 "cs.ATG" +#line 2244 "cs.ATG" op = BinaryOperatorType.ShiftRight; } UnaryExpr( -#line 2252 "cs.ATG" +#line 2247 "cs.ATG" out expr); AdditiveExpr( -#line 2252 "cs.ATG" +#line 2247 "cs.ATG" ref expr); -#line 2252 "cs.ATG" +#line 2247 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void AdditiveExpr( -#line 2256 "cs.ATG" +#line 2251 "cs.ATG" ref Expression outExpr) { -#line 2258 "cs.ATG" +#line 2253 "cs.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; MultiplicativeExpr( -#line 2262 "cs.ATG" +#line 2257 "cs.ATG" ref outExpr); while (la.kind == 4 || la.kind == 5) { if (la.kind == 4) { lexer.NextToken(); -#line 2265 "cs.ATG" +#line 2260 "cs.ATG" op = BinaryOperatorType.Add; } else { lexer.NextToken(); -#line 2266 "cs.ATG" +#line 2261 "cs.ATG" op = BinaryOperatorType.Subtract; } UnaryExpr( -#line 2268 "cs.ATG" +#line 2263 "cs.ATG" out expr); MultiplicativeExpr( -#line 2268 "cs.ATG" +#line 2263 "cs.ATG" ref expr); -#line 2268 "cs.ATG" +#line 2263 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void MultiplicativeExpr( -#line 2272 "cs.ATG" +#line 2267 "cs.ATG" ref Expression outExpr) { -#line 2274 "cs.ATG" +#line 2269 "cs.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; @@ -5479,82 +5474,82 @@ ref Expression outExpr) { if (la.kind == 6) { lexer.NextToken(); -#line 2280 "cs.ATG" +#line 2275 "cs.ATG" op = BinaryOperatorType.Multiply; } else if (la.kind == 7) { lexer.NextToken(); -#line 2281 "cs.ATG" +#line 2276 "cs.ATG" op = BinaryOperatorType.Divide; } else { lexer.NextToken(); -#line 2282 "cs.ATG" +#line 2277 "cs.ATG" op = BinaryOperatorType.Modulus; } UnaryExpr( -#line 2284 "cs.ATG" +#line 2279 "cs.ATG" out expr); -#line 2284 "cs.ATG" +#line 2279 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void TypeParameterConstraintsClauseBase( -#line 2390 "cs.ATG" +#line 2385 "cs.ATG" out TypeReference type) { -#line 2391 "cs.ATG" +#line 2386 "cs.ATG" TypeReference t; type = null; if (la.kind == 109) { lexer.NextToken(); -#line 2393 "cs.ATG" +#line 2388 "cs.ATG" type = TypeReference.StructConstraint; } else if (la.kind == 59) { lexer.NextToken(); -#line 2394 "cs.ATG" +#line 2389 "cs.ATG" type = TypeReference.ClassConstraint; } else if (la.kind == 89) { lexer.NextToken(); Expect(20); Expect(21); -#line 2395 "cs.ATG" +#line 2390 "cs.ATG" type = TypeReference.NewConstraint; } else if (StartOf(10)) { Type( -#line 2396 "cs.ATG" +#line 2391 "cs.ATG" out t); -#line 2396 "cs.ATG" +#line 2391 "cs.ATG" type = t; } else SynErr(216); } void QueryExpressionFromClause( -#line 2411 "cs.ATG" +#line 2406 "cs.ATG" out QueryExpressionFromClause fc) { -#line 2412 "cs.ATG" +#line 2407 "cs.ATG" fc = new QueryExpressionFromClause(); fc.StartLocation = la.Location; Expect(137); QueryExpressionFromOrJoinClause( -#line 2416 "cs.ATG" +#line 2411 "cs.ATG" fc); -#line 2417 "cs.ATG" +#line 2412 "cs.ATG" fc.EndLocation = t.EndLocation; } void QueryExpressionBody( -#line 2447 "cs.ATG" +#line 2442 "cs.ATG" ref QueryExpression q) { -#line 2448 "cs.ATG" +#line 2443 "cs.ATG" QueryExpressionFromClause fromClause; QueryExpressionWhereClause whereClause; QueryExpressionLetClause letClause; QueryExpressionJoinClause joinClause; QueryExpressionOrderClause orderClause; @@ -5563,249 +5558,249 @@ ref QueryExpression q) { while (StartOf(39)) { if (la.kind == 137) { QueryExpressionFromClause( -#line 2454 "cs.ATG" +#line 2449 "cs.ATG" out fromClause); -#line 2454 "cs.ATG" +#line 2449 "cs.ATG" SafeAdd(q, q.MiddleClauses, fromClause); } else if (la.kind == 127) { QueryExpressionWhereClause( -#line 2455 "cs.ATG" +#line 2450 "cs.ATG" out whereClause); -#line 2455 "cs.ATG" +#line 2450 "cs.ATG" SafeAdd(q, q.MiddleClauses, whereClause); } else if (la.kind == 141) { QueryExpressionLetClause( -#line 2456 "cs.ATG" +#line 2451 "cs.ATG" out letClause); -#line 2456 "cs.ATG" +#line 2451 "cs.ATG" SafeAdd(q, q.MiddleClauses, letClause); } else if (la.kind == 142) { QueryExpressionJoinClause( -#line 2457 "cs.ATG" +#line 2452 "cs.ATG" out joinClause); -#line 2457 "cs.ATG" +#line 2452 "cs.ATG" SafeAdd(q, q.MiddleClauses, joinClause); } else { QueryExpressionOrderByClause( -#line 2458 "cs.ATG" +#line 2453 "cs.ATG" out orderClause); -#line 2458 "cs.ATG" +#line 2453 "cs.ATG" SafeAdd(q, q.MiddleClauses, orderClause); } } if (la.kind == 133) { QueryExpressionSelectClause( -#line 2460 "cs.ATG" +#line 2455 "cs.ATG" out selectClause); -#line 2460 "cs.ATG" +#line 2455 "cs.ATG" q.SelectOrGroupClause = selectClause; } else if (la.kind == 134) { QueryExpressionGroupClause( -#line 2461 "cs.ATG" +#line 2456 "cs.ATG" out groupClause); -#line 2461 "cs.ATG" +#line 2456 "cs.ATG" q.SelectOrGroupClause = groupClause; } else SynErr(217); if (la.kind == 136) { QueryExpressionIntoClause( -#line 2463 "cs.ATG" +#line 2458 "cs.ATG" ref q); } } void QueryExpressionFromOrJoinClause( -#line 2437 "cs.ATG" +#line 2432 "cs.ATG" QueryExpressionFromOrJoinClause fjc) { -#line 2438 "cs.ATG" +#line 2433 "cs.ATG" TypeReference type; Expression expr; -#line 2440 "cs.ATG" +#line 2435 "cs.ATG" fjc.Type = null; if ( -#line 2441 "cs.ATG" +#line 2436 "cs.ATG" IsLocalVarDecl()) { Type( -#line 2441 "cs.ATG" +#line 2436 "cs.ATG" out type); -#line 2441 "cs.ATG" +#line 2436 "cs.ATG" fjc.Type = type; } Identifier(); -#line 2442 "cs.ATG" +#line 2437 "cs.ATG" fjc.Identifier = t.val; Expect(81); Expr( -#line 2444 "cs.ATG" +#line 2439 "cs.ATG" out expr); -#line 2444 "cs.ATG" +#line 2439 "cs.ATG" fjc.InExpression = expr; } void QueryExpressionJoinClause( -#line 2420 "cs.ATG" +#line 2415 "cs.ATG" out QueryExpressionJoinClause jc) { -#line 2421 "cs.ATG" +#line 2416 "cs.ATG" jc = new QueryExpressionJoinClause(); jc.StartLocation = la.Location; Expression expr; Expect(142); QueryExpressionFromOrJoinClause( -#line 2426 "cs.ATG" +#line 2421 "cs.ATG" jc); Expect(143); Expr( -#line 2428 "cs.ATG" +#line 2423 "cs.ATG" out expr); -#line 2428 "cs.ATG" +#line 2423 "cs.ATG" jc.OnExpression = expr; Expect(144); Expr( -#line 2430 "cs.ATG" +#line 2425 "cs.ATG" out expr); -#line 2430 "cs.ATG" +#line 2425 "cs.ATG" jc.EqualsExpression = expr; if (la.kind == 136) { lexer.NextToken(); Identifier(); -#line 2432 "cs.ATG" +#line 2427 "cs.ATG" jc.IntoIdentifier = t.val; } -#line 2434 "cs.ATG" +#line 2429 "cs.ATG" jc.EndLocation = t.EndLocation; } void QueryExpressionWhereClause( -#line 2466 "cs.ATG" +#line 2461 "cs.ATG" out QueryExpressionWhereClause wc) { -#line 2467 "cs.ATG" +#line 2462 "cs.ATG" Expression expr; wc = new QueryExpressionWhereClause(); wc.StartLocation = la.Location; Expect(127); Expr( -#line 2470 "cs.ATG" +#line 2465 "cs.ATG" out expr); -#line 2470 "cs.ATG" +#line 2465 "cs.ATG" wc.Condition = expr; -#line 2471 "cs.ATG" +#line 2466 "cs.ATG" wc.EndLocation = t.EndLocation; } void QueryExpressionLetClause( -#line 2474 "cs.ATG" +#line 2469 "cs.ATG" out QueryExpressionLetClause wc) { -#line 2475 "cs.ATG" +#line 2470 "cs.ATG" Expression expr; wc = new QueryExpressionLetClause(); wc.StartLocation = la.Location; Expect(141); Identifier(); -#line 2478 "cs.ATG" +#line 2473 "cs.ATG" wc.Identifier = t.val; Expect(3); Expr( -#line 2480 "cs.ATG" +#line 2475 "cs.ATG" out expr); -#line 2480 "cs.ATG" +#line 2475 "cs.ATG" wc.Expression = expr; -#line 2481 "cs.ATG" +#line 2476 "cs.ATG" wc.EndLocation = t.EndLocation; } void QueryExpressionOrderByClause( -#line 2484 "cs.ATG" +#line 2479 "cs.ATG" out QueryExpressionOrderClause oc) { -#line 2485 "cs.ATG" +#line 2480 "cs.ATG" QueryExpressionOrdering ordering; oc = new QueryExpressionOrderClause(); oc.StartLocation = la.Location; Expect(140); QueryExpressionOrdering( -#line 2488 "cs.ATG" +#line 2483 "cs.ATG" out ordering); -#line 2488 "cs.ATG" +#line 2483 "cs.ATG" SafeAdd(oc, oc.Orderings, ordering); while (la.kind == 14) { lexer.NextToken(); QueryExpressionOrdering( -#line 2490 "cs.ATG" +#line 2485 "cs.ATG" out ordering); -#line 2490 "cs.ATG" +#line 2485 "cs.ATG" SafeAdd(oc, oc.Orderings, ordering); } -#line 2492 "cs.ATG" +#line 2487 "cs.ATG" oc.EndLocation = t.EndLocation; } void QueryExpressionSelectClause( -#line 2505 "cs.ATG" +#line 2500 "cs.ATG" out QueryExpressionSelectClause sc) { -#line 2506 "cs.ATG" +#line 2501 "cs.ATG" Expression expr; sc = new QueryExpressionSelectClause(); sc.StartLocation = la.Location; Expect(133); Expr( -#line 2509 "cs.ATG" +#line 2504 "cs.ATG" out expr); -#line 2509 "cs.ATG" +#line 2504 "cs.ATG" sc.Projection = expr; -#line 2510 "cs.ATG" +#line 2505 "cs.ATG" sc.EndLocation = t.EndLocation; } void QueryExpressionGroupClause( -#line 2513 "cs.ATG" +#line 2508 "cs.ATG" out QueryExpressionGroupClause gc) { -#line 2514 "cs.ATG" +#line 2509 "cs.ATG" Expression expr; gc = new QueryExpressionGroupClause(); gc.StartLocation = la.Location; Expect(134); Expr( -#line 2517 "cs.ATG" +#line 2512 "cs.ATG" out expr); -#line 2517 "cs.ATG" +#line 2512 "cs.ATG" gc.Projection = expr; Expect(135); Expr( -#line 2519 "cs.ATG" +#line 2514 "cs.ATG" out expr); -#line 2519 "cs.ATG" +#line 2514 "cs.ATG" gc.GroupBy = expr; -#line 2520 "cs.ATG" +#line 2515 "cs.ATG" gc.EndLocation = t.EndLocation; } void QueryExpressionIntoClause( -#line 2523 "cs.ATG" +#line 2518 "cs.ATG" ref QueryExpression q) { -#line 2524 "cs.ATG" +#line 2519 "cs.ATG" QueryExpression firstQuery = q; QueryExpression continuedQuery = new QueryExpression(); continuedQuery.StartLocation = q.StartLocation; @@ -5820,43 +5815,43 @@ ref QueryExpression q) { Expect(136); Identifier(); -#line 2537 "cs.ATG" +#line 2532 "cs.ATG" continuedQuery.FromClause.Identifier = t.val; -#line 2538 "cs.ATG" +#line 2533 "cs.ATG" continuedQuery.FromClause.EndLocation = t.EndLocation; QueryExpressionBody( -#line 2539 "cs.ATG" +#line 2534 "cs.ATG" ref q); } void QueryExpressionOrdering( -#line 2495 "cs.ATG" +#line 2490 "cs.ATG" out QueryExpressionOrdering ordering) { -#line 2496 "cs.ATG" +#line 2491 "cs.ATG" Expression expr; ordering = new QueryExpressionOrdering(); ordering.StartLocation = la.Location; Expr( -#line 2498 "cs.ATG" +#line 2493 "cs.ATG" out expr); -#line 2498 "cs.ATG" +#line 2493 "cs.ATG" ordering.Criteria = expr; if (la.kind == 138 || la.kind == 139) { if (la.kind == 138) { lexer.NextToken(); -#line 2499 "cs.ATG" +#line 2494 "cs.ATG" ordering.Direction = QueryExpressionOrderingDirection.Ascending; } else { lexer.NextToken(); -#line 2500 "cs.ATG" +#line 2495 "cs.ATG" ordering.Direction = QueryExpressionOrderingDirection.Descending; } } -#line 2502 "cs.ATG" +#line 2497 "cs.ATG" ordering.EndLocation = t.EndLocation; } diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG index 3084b7ba5e..7056dc0f8f 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG +++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG @@ -297,12 +297,7 @@ AttributeSection [ IF (IsLocalAttrTarget()) ( "event" (. attributeTarget = "event";.) | "return" (. attributeTarget = "return";.) - | Identifier (. if (t.val != "field" && t.val != "method" && - t.val != "param" && - t.val != "property" && t.val != "type") - Error("attribute target specifier (field, event, method, param, property, return or type) expected"); - attributeTarget = t.val; - .) + | Identifier (. attributeTarget = t.val; .) ) ":" ] /*--- attribute list: */ diff --git a/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs b/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs index af7af94e49..e428bae70b 100644 --- a/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs @@ -179,6 +179,28 @@ public abstract class MyClass : MyBase, Interface1, My.Test.Interface2 Assert.AreEqual(ClassType.Enum, td.Type); Assert.AreEqual("MyEnum", td.Name); } + + [Test] + public void ContextSensitiveKeywordTest() + { + TypeDeclaration td = ParseUtilCSharp.ParseGlobal("partial class partial<[partial: where] where> where where : partial { }"); + + Assert.AreEqual(Modifiers.Partial, td.Modifier); + Assert.AreEqual("partial", td.Name); + + Assert.AreEqual(1, td.Templates.Count); + TemplateDefinition tp = td.Templates[0]; + Assert.AreEqual("where", tp.Name); + + Assert.AreEqual(1, tp.Attributes.Count); + Assert.AreEqual("partial", tp.Attributes[0].AttributeTarget); + Assert.AreEqual(1, tp.Attributes[0].Attributes.Count); + Assert.AreEqual("where", tp.Attributes[0].Attributes[0].Name); + + Assert.AreEqual(1, tp.Bases.Count); + Assert.AreEqual("partial", tp.Bases[0].Type); + Assert.AreEqual("where", tp.Bases[0].GenericTypes[0].Type); + } #endregion #region VB.NET From 1e22646923cc9f57790a429864c9ea3700713523 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 26 Sep 2009 20:41:47 +0000 Subject: [PATCH 11/13] Added smart indenting for Python. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@5007 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../PythonBinding/Project/PythonBinding.addin | 4 + .../Project/PythonBinding.csproj | 1 + .../Project/Src/PythonFormattingStrategy.cs | 76 +++++++ .../Test/AddInFileTestFixture.cs | 8 + .../Test/PythonBinding.Tests.csproj | 1 + .../Test/PythonIndentationTests.cs | 205 ++++++++++++++++++ .../Test/Utils/MockTextEditorProperties.cs | 1 + 7 files changed, 296 insertions(+) create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormattingStrategy.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonIndentationTests.cs diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.addin b/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.addin index 6d476b688c..2e7a56c9a7 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.addin +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.addin @@ -24,6 +24,10 @@ resource="ICSharpCode.PythonBinding.Resources.Python.xshd"/> + + + + + diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormattingStrategy.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormattingStrategy.cs new file mode 100644 index 0000000000..55ad526f35 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormattingStrategy.cs @@ -0,0 +1,76 @@ +// +// +// +// +// $Revision$ +// + +using System; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Actions; +using ICSharpCode.TextEditor.Document; + +namespace ICSharpCode.PythonBinding +{ + public class PythonFormattingStrategy : DefaultFormattingStrategy + { + public PythonFormattingStrategy() + { + } + + protected override int SmartIndentLine(TextArea textArea, int line) + { + IDocument document = textArea.Document; + LineSegment previousLine = document.GetLineSegment(line - 1); + string previousLineText = document.GetText(previousLine).Trim(); + + if (previousLineText.EndsWith(":")) { + return IncreaseLineIndent(textArea, line); + } else if (previousLineText == "pass") { + return DecreaseLineIndent(textArea, line); + } else if ((previousLineText == "return") || (previousLineText.StartsWith("return "))) { + return DecreaseLineIndent(textArea, line); + } else if ((previousLineText == "raise") || (previousLineText.StartsWith("raise "))) { + return DecreaseLineIndent(textArea, line); + } else if (previousLineText == "break") { + return DecreaseLineIndent(textArea, line); + } + return base.SmartIndentLine(textArea, line); + } + + int IncreaseLineIndent(TextArea textArea, int line) + { + return ModifyLineIndent(textArea, line, true); + } + + int DecreaseLineIndent(TextArea textArea, int line) + { + return ModifyLineIndent(textArea, line, false); + } + + int ModifyLineIndent(TextArea textArea, int line, bool increaseIndent) + { + IDocument document = textArea.Document; + LineSegment currentLine = document.GetLineSegment(line); + string indentation = GetIndentation(textArea, line - 1); + indentation = GetNewLineIndentation(indentation, Tab.GetIndentationString(document), increaseIndent); + string newIndentedText = indentation + document.GetText(currentLine); + SmartReplaceLine(document, currentLine, newIndentedText); + return indentation.Length; + } + + string GetNewLineIndentation(string previousLineIndentation, string singleIndent, bool increaseIndent) + { + if (increaseIndent) { + return previousLineIndentation + singleIndent; + } + + // Decrease the new line indentation. + int decreaselength = previousLineIndentation.Length - singleIndent.Length; + if (decreaselength < 0) { + decreaselength = 0; + } + return previousLineIndentation.Substring(0, decreaselength); + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/AddInFileTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/AddInFileTestFixture.cs index 88e0c37860..7722d4b3c0 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/AddInFileTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/AddInFileTestFixture.cs @@ -51,6 +51,7 @@ namespace PythonBinding.Tests Codon pythonProjectIconCodon; Codon convertCSharpProjectCodon; Codon convertVBNetProjectCodon; + Codon formattingStrategyCodon; [TestFixtureSetUp] public void SetupFixture() @@ -83,6 +84,7 @@ namespace PythonBinding.Tests pythonProjectIconCodon = GetCodon("/Workspace/Icons", "PythonProjectIcon"); convertCSharpProjectCodon = GetCodon("/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ProjectActions/Convert", "CSharpProjectToPythonProjectConverter"); convertVBNetProjectCodon = GetCodon("/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ProjectActions/Convert", "VBNetProjectToPythonProjectConverter"); + formattingStrategyCodon = GetCodon("/AddIns/DefaultTextEditor/Formatter/Python", "PythonFormatter"); // Get the PythonBinding runtime. foreach (Runtime runtime in addin.Runtimes) { @@ -749,6 +751,12 @@ namespace PythonBinding.Tests { Assert.AreEqual(pythonWithoutDebuggerRunMenuItemCodon.Conditions[0], pythonRunMenuItemCodon.Conditions[0]); } + + [Test] + public void PythonFormatterClass() + { + Assert.AreEqual("ICSharpCode.PythonBinding.PythonFormattingStrategy", formattingStrategyCodon["class"]); + } Codon GetCodon(string name, string extensionPath) { diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj index cbba547df8..a40cb01b0c 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj @@ -306,6 +306,7 @@ + diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonIndentationTests.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonIndentationTests.cs new file mode 100644 index 0000000000..9d15beef43 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonIndentationTests.cs @@ -0,0 +1,205 @@ +// +// +// +// +// $Revision$ +// + +using System; +using ICSharpCode.PythonBinding; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.TextEditor.Actions; +using NUnit.Framework; +using PythonBinding.Tests.Utils; + +namespace PythonBinding.Tests.Indentation +{ + /// + /// Tests that the PythonFormattingStrategy indents the new line added after pressing the ':' character. + /// + [TestFixture] + public class PythonNewMethodIndentationTestFixture + { + TextEditorControl textEditor; + PythonFormattingStrategy formattingStrategy; + + [SetUp] + public void Init() + { + MockTextEditorProperties textEditorProperties = new MockTextEditorProperties(); + textEditorProperties.IndentStyle = IndentStyle.Smart; + textEditorProperties.TabIndent = 4; + textEditor = new TextEditorControl(); + textEditor.TextEditorProperties = textEditorProperties; + formattingStrategy = new PythonFormattingStrategy(); + } + + [TearDown] + public void TearDown() + { + textEditor.Dispose(); + } + + [Test] + public void NewMethodDefinition() + { + textEditor.Text = "def newMethod:\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 1); + string expectedText = "def newMethod:\r\n" + + "\t"; + + Assert.AreEqual(expectedText, textEditor.Text); + Assert.AreEqual(1, indentResult); + } + + [Test] + public void NoExtraIndentationRequired() + { + textEditor.Text = "\tprint 'abc'\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 1); + string expectedText = "\tprint 'abc'\r\n" + + "\t"; + + Assert.AreEqual(expectedText, textEditor.Text); + Assert.AreEqual(1, indentResult); + } + + [Test] + public void PassStatementDecreasesIndentOnThirdLine() + { + textEditor.Text = "def method1:\r\n" + + "\tpass\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 2); + string expectedText = "def method1:\r\n" + + "\tpass\r\n" + + ""; + + Assert.AreEqual(expectedText, textEditor.Text); + } + + [Test] + public void ReturnValueStatementDecreasesIndentOnThirdLine() + { + textEditor.Text = "def method1:\r\n" + + "\treturn 0\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 2); + string expectedText = "def method1:\r\n" + + "\treturn 0\r\n" + + ""; + + Assert.AreEqual(expectedText, textEditor.Text); + } + + [Test] + public void ReturnStatementDecreasesIndentOnThirdLine() + { + textEditor.Text = "def method1:\r\n" + + "\treturn\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 2); + string expectedText = "def method1:\r\n" + + "\treturn\r\n" + + ""; + + Assert.AreEqual(expectedText, textEditor.Text); + } + [Test] + public void ReturnStatementWithNoIndentOnPreviousLine() + { + textEditor.Text = "return\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 1); + string expectedText = "return\r\n" + + ""; + + Assert.AreEqual(expectedText, textEditor.Text); + } + + [Test] + public void StatementIsNotAReturnOnPreviousLine() + { + textEditor.Text = "\treturnValue\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 1); + string expectedText = "\treturnValue\r\n" + + "\t"; + + Assert.AreEqual(expectedText, textEditor.Text); + } + + [Test] + public void RaiseStatementWithObjectDecreasesIndentOnThirdLine() + { + textEditor.Text = "def method1:\r\n" + + "\traise 'a'\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 2); + string expectedText = "def method1:\r\n" + + "\traise 'a'\r\n" + + ""; + + Assert.AreEqual(expectedText, textEditor.Text); + } + + [Test] + public void RaiseStatementDecreasesIndentOnThirdLine() + { + textEditor.Text = "def method1:\r\n" + + "\traise\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 2); + string expectedText = "def method1:\r\n" + + "\traise\r\n" + + ""; + + Assert.AreEqual(expectedText, textEditor.Text); + } + + [Test] + public void StatementIsNotARaiseStatementOnPreviousLine() + { + textEditor.Text = "def method1:\r\n" + + "\traiseThis\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 2); + string expectedText = "def method1:\r\n" + + "\traiseThis\r\n" + + "\t"; + + Assert.AreEqual(expectedText, textEditor.Text); + } + + [Test] + public void BreakStatementDecreasesIndentOnThirdLine() + { + textEditor.Text = "def method1:\r\n" + + "\tbreak\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 2); + string expectedText = "def method1:\r\n" + + "\tbreak\r\n" + + ""; + + Assert.AreEqual(expectedText, textEditor.Text); + } + + [Test] + public void StatementIsNotABreakStatementOnPreviousLine() + { + textEditor.Text = "def method1:\r\n" + + "\tbreakThis\r\n" + + ""; + int indentResult = formattingStrategy.IndentLine(textEditor.ActiveTextAreaControl.TextArea, 2); + string expectedText = "def method1:\r\n" + + "\tbreakThis\r\n" + + "\t"; + + Assert.AreEqual(expectedText, textEditor.Text); + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockTextEditorProperties.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockTextEditorProperties.cs index e54df5268f..bee4d59345 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockTextEditorProperties.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockTextEditorProperties.cs @@ -17,6 +17,7 @@ namespace PythonBinding.Tests.Utils { public MockTextEditorProperties() { + FontContainer = new FontContainer(SystemFonts.MenuFont); } public bool CaretLine { get; set; } From e4591410ee120f8e87836d699876f581343cc49c Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 27 Sep 2009 19:26:40 +0000 Subject: [PATCH 12/13] optimized processing of *Self columns to avoid GUI hangs in SharpDevelop git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@5009 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Profiler/Controller/Data/CallTreeNode.cs | 24 +++++- .../Data/ProfilingDataSQLiteProvider.cs | 75 +++++++++---------- .../Controller/Data/SQLiteCallTreeNode.cs | 21 +++++- .../Data/UnitTestRootCallTreeNode.cs | 39 ++++++---- .../Controller/Data/UnmanagedCallTreeNode.cs | 6 ++ .../Controls/CallTreeNodeViewModel.cs | 16 ++-- 6 files changed, 112 insertions(+), 69 deletions(-) diff --git a/src/AddIns/Misc/Profiler/Controller/Data/CallTreeNode.cs b/src/AddIns/Misc/Profiler/Controller/Data/CallTreeNode.cs index ca61b51764..7a170fbd67 100644 --- a/src/AddIns/Misc/Profiler/Controller/Data/CallTreeNode.cs +++ b/src/AddIns/Misc/Profiler/Controller/Data/CallTreeNode.cs @@ -79,12 +79,17 @@ namespace ICSharpCode.Profiler.Controller.Data /// public abstract long CpuCyclesSpent { get; } + long cpuCyclesSpentSelf = -1; + /// /// Gets how many CPU cycles were spent inside this method, excluding sub calls. /// public virtual long CpuCyclesSpentSelf { get { - return GetCpuCyclesSelf(); + if (cpuCyclesSpentSelf == -1) + cpuCyclesSpentSelf = GetCpuCyclesSelf(); + + return cpuCyclesSpentSelf; } } @@ -116,11 +121,19 @@ namespace ICSharpCode.Profiler.Controller.Data /// /// Determines whether this node is a thread node or not. /// - public bool IsThread - { + public bool IsThread { get { return this.Name.StartsWith("Thread#", StringComparison.Ordinal); } } + /// + /// Determines whether this node has chil + /// + public virtual bool HasChildren { + get { + return this.Children.Any(); + } + } + /// /// Gets a readonly list of the string representation of the parameters. /// @@ -136,6 +149,11 @@ namespace ICSharpCode.Profiler.Controller.Data /// public abstract double TimeSpent { get; } + /// + /// Gets the time spent inside the method (excluding sub calls) in milliseconds. + /// + public abstract double TimeSpentSelf { get; } + /// /// Gets a reference to the parent of this CallTreeNode. /// diff --git a/src/AddIns/Misc/Profiler/Controller/Data/ProfilingDataSQLiteProvider.cs b/src/AddIns/Misc/Profiler/Controller/Data/ProfilingDataSQLiteProvider.cs index 9df90fec69..a5afa7fb36 100644 --- a/src/AddIns/Misc/Profiler/Controller/Data/ProfilingDataSQLiteProvider.cs +++ b/src/AddIns/Misc/Profiler/Controller/Data/ProfilingDataSQLiteProvider.cs @@ -60,35 +60,11 @@ namespace ICSharpCode.Profiler.Controller.Data internal IQueryable GetChildren(SQLiteCallTreeNode parent) { - SQLiteCommand cmd; - using (LockAndCreateCommand(out cmd)) { - cmd.CommandText = @"SELECT id, nameid, callcount, timespent, isactiveatstart - FROM FunctionData - WHERE parentid IN(" + string.Join(",", parent.ids.Select(a => a.ToString(CultureInfo.InvariantCulture.NumberFormat)).ToArray()) + @") - ORDER BY id;"; - - using (SQLiteDataReader reader = cmd.ExecuteReader()) { - List items = new List(); - - while (reader.Read()) { - int childNameId = reader.GetInt32(1); - SQLiteCallTreeNode newItem = items.Find(node => node.nameId == childNameId); - if (newItem == null) { - newItem = new SQLiteCallTreeNode(childNameId, (parent.nameId == 0) ? null : parent, this); - items.Add(newItem); - - // works because of ORDER BY id - newItem.isActiveAtStart = reader.GetBoolean(4); - } - - newItem.callCount += reader.GetInt32(2); - newItem.cpuCyclesSpent += (ulong)reader.GetInt64(3); - newItem.ids.Add(reader.GetInt32(0)); - } - - return items.Cast().AsQueryable(); - } - } + string[] ids = parent.ids + .Select(a => a.ToString(CultureInfo.InvariantCulture)) + .ToArray(); + + return GetMergedFunctionData("parentid IN(" + string.Join(",", ids) + ")", parent.selectionStartIndex); } internal IQueryable GetCallers(SQLiteCallTreeNode item) @@ -114,6 +90,7 @@ namespace ICSharpCode.Profiler.Controller.Data SQLiteCallTreeNode newItem = items.Find(node => node.nameId == childNameId); if (newItem == null) { newItem = new SQLiteCallTreeNode(childNameId, null, this); + newItem.selectionStartIndex = item.selectionStartIndex; items.Add(newItem); // works because of ORDER BY id @@ -291,6 +268,8 @@ namespace ICSharpCode.Profiler.Controller.Data using (SQLiteDataReader reader = cmd.ExecuteReader()) { SQLiteCallTreeNode root = new SQLiteCallTreeNode(0, null, this); + + root.selectionStartIndex = startIndex; while (reader.Read()) { root.callCount += reader.GetInt32(2); @@ -303,6 +282,7 @@ namespace ICSharpCode.Profiler.Controller.Data } } + #region Properties /// public override void SetProperty(string name, string value) { @@ -349,6 +329,7 @@ namespace ICSharpCode.Profiler.Controller.Data return null; } + #endregion int processorFrequency = -1; @@ -375,35 +356,49 @@ namespace ICSharpCode.Profiler.Controller.Data if (endIndex < startIndex || endIndex >= this.DataSets.Count) throw new ArgumentOutOfRangeException("endIndex", endIndex, "Value must be between " + startIndex + " and " + (this.DataSets.Count - 1)); - IList functions = new List(); + var result = GetMergedFunctionData(string.Format("datasetid BETWEEN {0} AND {1}", startIndex, endIndex), startIndex); + + return result + .Where(i => i.NameMapping.Id != 0 && !i.NameMapping.Name.StartsWith("Thread#", StringComparison.Ordinal)) + .AsQueryable(); + } + + IQueryable GetMergedFunctionData(string condition, int startIndex) + { + IList result = new List(); SQLiteCommand cmd; using (LockAndCreateCommand(out cmd)) { - cmd.CommandText = @"SELECT GROUP_CONCAT(id), nameid, SUM(timespent), SUM(callcount) - FROM FunctionData - WHERE datasetid BETWEEN @start AND @end - GROUP BY nameid;"; - cmd.Parameters.Add(new SQLiteParameter("@start", startIndex)); - cmd.Parameters.Add(new SQLiteParameter("@end", endIndex)); + cmd.CommandText = @"SELECT + GROUP_CONCAT(id), + nameid, + SUM(timespent), + SUM(callcount), + MAX(id != endid) AS hasChildren, + SUM((datasetid = " + startIndex + @") AND isActiveAtStart) AS activeCallCount + FROM FunctionData + WHERE " + condition + @" + GROUP BY nameid;"; using (SQLiteDataReader reader = cmd.ExecuteReader()) { - while (reader.Read()) { SQLiteCallTreeNode node = new SQLiteCallTreeNode(reader.GetInt32(1), null, this); + node.selectionStartIndex = startIndex; node.callCount = reader.GetInt32(3); node.cpuCyclesSpent = (ulong)reader.GetInt64(2); node.ids = reader.GetString(0).Split(',').Select(s => int.Parse(s)).ToList(); node.ids.Sort(); + node.hasChildren = reader.GetBoolean(4); + node.activeCallCount = reader.GetInt32(5); // Can not do filtering of root and thread nodes here, // because retrieval of names needs access to DB // which is forbidden now (we are inside the lock!) - functions.Add(node); + result.Add(node); } } } - // Do filtering now via LINQ - return functions.SkipWhile(i => i.NameMapping.Id == 0 || i.NameMapping.Name.StartsWith("Thread#", StringComparison.Ordinal)).AsQueryable(); + return result.AsQueryable(); } LockObject LockAndCreateCommand(out SQLiteCommand cmd) diff --git a/src/AddIns/Misc/Profiler/Controller/Data/SQLiteCallTreeNode.cs b/src/AddIns/Misc/Profiler/Controller/Data/SQLiteCallTreeNode.cs index 32faaec03a..c9b390b8e3 100644 --- a/src/AddIns/Misc/Profiler/Controller/Data/SQLiteCallTreeNode.cs +++ b/src/AddIns/Misc/Profiler/Controller/Data/SQLiteCallTreeNode.cs @@ -26,6 +26,9 @@ namespace ICSharpCode.Profiler.Controller.Data CallTreeNode parent; ProfilingDataSQLiteProvider provider; internal List ids = new List(); + internal bool hasChildren; + internal int activeCallCount; + internal int selectionStartIndex; /// /// Creates a new CallTreeNode. @@ -91,6 +94,12 @@ namespace ICSharpCode.Profiler.Controller.Data return CpuCyclesSpent / (1000.0 * this.provider.ProcessorFrequency); } } + + public override double TimeSpentSelf { + get { + return CpuCyclesSpentSelf / (1000.0 * this.provider.ProcessorFrequency); + } + } /// /// Gets whether the function call started in a previous data set that's not selected. @@ -101,8 +110,12 @@ namespace ICSharpCode.Profiler.Controller.Data } } + public override int CallCount { + get { return callCount + activeCallCount; } + } + /// - /// Merges a collection of CallTreeNodes into one CallTreeNode, all valuess are accumulated. + /// Merges a collection of CallTreeNodes into one CallTreeNode, all values are accumulated. /// /// The collection of nodes to process. /// A new CallTreeNode. @@ -110,8 +123,10 @@ namespace ICSharpCode.Profiler.Controller.Data { SQLiteCallTreeNode mergedNode = new SQLiteCallTreeNode(0, null, this.provider); bool initialised = false; + foreach (SQLiteCallTreeNode node in nodes) { mergedNode.ids.AddRange(node.ids); + mergedNode.selectionStartIndex = Math.Min(mergedNode.selectionStartIndex, node.selectionStartIndex); mergedNode.callCount += node.callCount; mergedNode.cpuCyclesSpent += node.cpuCyclesSpent; if (!initialised || mergedNode.nameId == node.nameId) @@ -168,5 +183,9 @@ namespace ICSharpCode.Profiler.Controller.Data return hash; } + + public override bool HasChildren { + get { return this.hasChildren; } + } } } diff --git a/src/AddIns/Misc/Profiler/Controller/Data/UnitTestRootCallTreeNode.cs b/src/AddIns/Misc/Profiler/Controller/Data/UnitTestRootCallTreeNode.cs index 357083d872..5aacd3feed 100644 --- a/src/AddIns/Misc/Profiler/Controller/Data/UnitTestRootCallTreeNode.cs +++ b/src/AddIns/Misc/Profiler/Controller/Data/UnitTestRootCallTreeNode.cs @@ -18,7 +18,7 @@ namespace ICSharpCode.Profiler.Controller.Data List unitTests; /// - /// Creates a new UnitTestRootCallTreeNode. + /// Creates a new UnitTestRootCallTreeNode. /// public UnitTestRootCallTreeNode(IEnumerable unitTests) { @@ -46,58 +46,65 @@ namespace ICSharpCode.Profiler.Controller.Data } } - /// + /// public override double TimeSpent { get { return 0; } } - - /// + + /// public override int RawCallCount { get { return 0; } } - - /// + + /// public override CallTreeNode Parent { get { return null; } } - - /// + + /// public override CallTreeNode Merge(System.Collections.Generic.IEnumerable nodes) { // throw new ShouldNeverHappenException(); throw new NotSupportedException("Cannot merge a UnitTestRootCallTreeNode (should never be possible)"); } - - /// + + /// public override int GetHashCode() { return this.unitTests.Aggregate(0, (sum, item) => sum ^= item.GetHashCode()); } - - /// + + /// public override bool Equals(CallTreeNode other) { return (other is UnitTestRootCallTreeNode) && (other as UnitTestRootCallTreeNode).unitTests.SequenceEqual(unitTests); } - - /// + + /// public override IQueryable Callers { get { return Enumerable.Empty().AsQueryable(); } } - - /// + + /// public override IQueryable Children { get { return unitTests.AsQueryable(); } } + + /// + public override double TimeSpentSelf { + get { + return 0; + } + } } } diff --git a/src/AddIns/Misc/Profiler/Controller/Data/UnmanagedCallTreeNode.cs b/src/AddIns/Misc/Profiler/Controller/Data/UnmanagedCallTreeNode.cs index 899379f9e3..613019a319 100644 --- a/src/AddIns/Misc/Profiler/Controller/Data/UnmanagedCallTreeNode.cs +++ b/src/AddIns/Misc/Profiler/Controller/Data/UnmanagedCallTreeNode.cs @@ -94,6 +94,12 @@ namespace ICSharpCode.Profiler.Controller.Data return this.CpuCyclesSpent / (1000.0 * this.dataSet.ProcessorFrequency); } } + + public override double TimeSpentSelf { + get { + return this.CpuCyclesSpentSelf / (1000.0 * this.dataSet.ProcessorFrequency); + } + } public override CallTreeNode Merge(IEnumerable nodes) { diff --git a/src/AddIns/Misc/Profiler/Frontend/Controls/CallTreeNodeViewModel.cs b/src/AddIns/Misc/Profiler/Frontend/Controls/CallTreeNodeViewModel.cs index 3361965b52..c6e6ef8953 100644 --- a/src/AddIns/Misc/Profiler/Frontend/Controls/CallTreeNodeViewModel.cs +++ b/src/AddIns/Misc/Profiler/Frontend/Controls/CallTreeNodeViewModel.cs @@ -330,20 +330,18 @@ namespace ICSharpCode.Profiler.Controls public string TimeSpentSelf { get { - if (!node.IsThread) { - double value = node.TimeSpent - node.Children.Aggregate(0.0, (sum, item) => sum + item.TimeSpent); - return value.ToString("f6") + "ms"; - } else + if (!node.IsThread) + return node.TimeSpentSelf.ToString("f6") + "ms"; + else return null; } } public string TimeSpentSelfPerCall { get { - if (!node.IsThread) { - double value = node.TimeSpent - node.Children.Aggregate(0.0, (sum, item) => sum + item.TimeSpent); - return (value / node.CallCount).ToString("f6") + "ms"; - } else + if (!node.IsThread) + return (node.TimeSpentSelf / node.CallCount).ToString("f6") + "ms"; + else return null; } } @@ -369,7 +367,7 @@ namespace ICSharpCode.Profiler.Controls public Visibility CheckBoxVisibility { get { - if (this.Children.Count > 0) + if (node.HasChildren) return Visibility.Visible; else return Visibility.Hidden; From badb902cbda2f05aa10830d2d82174d0d0e0125a Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Sun, 27 Sep 2009 19:36:20 +0000 Subject: [PATCH 13/13] 3.1.1 designation for setup and build artefact packaging git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@5010 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/Automated.proj | 2 +- src/Setup/Setup.wxs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Automated.proj b/src/Automated.proj index ff421ac7bd..cf1e294ba2 100644 --- a/src/Automated.proj +++ b/src/Automated.proj @@ -11,7 +11,7 @@ $(ProjectDir)\src $(ProjectDir)\bin $(MSBuildProjectDirectory)\Tools\MSBuildCommunityTasks - SharpDevelop_3.1.0. + SharpDevelop_3.1.1. $(MSBuildProjectDirectory)\Tools\NUnit $(SharpDevelopSrc)\AddIns\Misc\Profiler diff --git a/src/Setup/Setup.wxs b/src/Setup/Setup.wxs index 955f0e1fba..e25e238e8c 100644 --- a/src/Setup/Setup.wxs +++ b/src/Setup/Setup.wxs @@ -8,14 +8,14 @@ --> -