From d595bff51e1694892623a134e0965583fc09df10 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 12:10:31 +0000 Subject: [PATCH 01/49] Implemented code-completion for Boo's CallableTypeReference. Added Boo resolver unit tests. Added workaround for IME crash in WOW64 mode. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1339 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/AddIns/BackendBindings/Boo/BooBinding.sln | 10 +- .../Src/CodeCompletion/ConvertVisitor.cs | 21 ++- .../Src/CodeCompletion/InferredReturnType.cs | 3 +- .../Src/CodeCompletion/ResolveVisitor.cs | 23 ++- .../CodeCompletion/VariableLookupVisitor.cs | 34 ++++- .../BooBinding/Test/BooBinding.Tests.csproj | 74 +++++++++ .../Boo/BooBinding/Test/ResolverTests.cs | 142 ++++++++++++++++++ .../src/Service/Help2RegistryWalker.cs | 4 +- .../Project/Src/Gui/Ime.cs | 54 ++++--- .../AnonymousMethodReturnType.cs | 86 ++++++++++- .../NRefactoryASTConvertVisitor.cs | 44 +++--- .../Src/Dom/NRefactoryResolver/TypeVisitor.cs | 6 +- 12 files changed, 436 insertions(+), 65 deletions(-) create mode 100644 src/AddIns/BackendBindings/Boo/BooBinding/Test/BooBinding.Tests.csproj create mode 100644 src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs diff --git a/src/AddIns/BackendBindings/Boo/BooBinding.sln b/src/AddIns/BackendBindings/Boo/BooBinding.sln index aafaa2a3d8..02bc32ff2a 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding.sln +++ b/src/AddIns/BackendBindings/Boo/BooBinding.sln @@ -1,5 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 9.00 -# SharpDevelop 2.0.0.1199 +# SharpDevelop 2.1.0.1333 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter", "NRefactoryToBooConverter\Project\NRefactoryToBooConverter.csproj", "{DBCF20A1-BA13-4582-BFA9-74DE4D987B73}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter.Tests", "NRefactoryToBooConverter\Test\NRefactoryToBooConverter.Tests.csproj", "{C9DE556D-325C-4544-B29F-16A9EB7C9830}" @@ -8,8 +8,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StandaloneConverter", "Stan EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}" EndProject -Project("{A33008B1-5DAC-44D5-9060-242E3B6E38F2}") = "Boo.InterpreterAddIn", "Boo.InterpreterAddIn\Project\Boo.InterpreterAddIn.booproj", "{928E34B2-5E46-4A4D-8E4D-2CA2CCDB905A}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "..\..\..\Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "..\..\..\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}" @@ -22,6 +20,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsUI", "..\..\..\Libr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "..\..\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding.Tests", "BooBinding\Test\BooBinding.Tests.csproj", "{6FA16499-896F-4C02-BB43-1AF5C6C7C713}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -80,5 +80,9 @@ Global {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release|Any CPU.Build.0 = Release|Any CPU {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Release|Any CPU.Build.0 = Release|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection EndGlobal diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs index a81fdd665d..d38e632df6 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs @@ -177,7 +177,7 @@ namespace Grunwald.BooBinding.CodeCompletion if (parameters == null || parameters.Count == 0) { m.Parameters = DefaultParameter.EmptyParameterList; } else { - AddParameters(parameters, m.Parameters); + AddParameters(parameters, m.Parameters, m, m.DeclaringType); } } void ConvertParameters(AST.ParameterDeclarationCollection parameters, DefaultProperty p) @@ -185,14 +185,17 @@ namespace Grunwald.BooBinding.CodeCompletion if (parameters == null || parameters.Count == 0) { p.Parameters = DefaultParameter.EmptyParameterList; } else { - AddParameters(parameters, p.Parameters); + AddParameters(parameters, p.Parameters, p, p.DeclaringType); } } - void AddParameters(AST.ParameterDeclarationCollection parameters, IList output) + internal static void AddParameters(AST.ParameterDeclarationCollection parameters, IList output, IMethodOrProperty method, IClass c) { + if (c == null) throw new ArgumentNullException("c"); DefaultParameter p = null; foreach (AST.ParameterDeclaration par in parameters) { - p = new DefaultParameter(par.Name, CreateReturnType(par.Type), GetRegion(par)); + p = new DefaultParameter(par.Name, + CreateReturnType(par.Type, c, method as IMethod, c.Region.BeginLine + 1, 1, c.ProjectContent), + new DomRegion(par.LexicalInfo.Line, par.LexicalInfo.Column)); if (par.IsByRef) p.Modifiers |= ParameterModifiers.Ref; output.Add(p); } @@ -211,7 +214,7 @@ namespace Grunwald.BooBinding.CodeCompletion } } public static IReturnType CreateReturnType(AST.TypeReference reference, IClass callingClass, - IMember callingMember, int caretLine, int caretColumn, + IMethodOrProperty callingMember, int caretLine, int caretColumn, IProjectContent projectContent) { if (reference == null) { @@ -244,7 +247,13 @@ namespace Grunwald.BooBinding.CodeCompletion } return rt; } else if (reference is AST.CallableTypeReference) { - return new AnonymousMethodReturnType(); + AST.CallableTypeReference ctr = (AST.CallableTypeReference)reference; + AnonymousMethodReturnType amrt = new AnonymousMethodReturnType(new DefaultCompilationUnit(projectContent)); + if (ctr.ReturnType != null) { + amrt.MethodReturnType = CreateReturnType(ctr.ReturnType, callingClass, callingMember, caretLine, caretColumn, projectContent); + } + AddParameters(ctr.Parameters, amrt.MethodParameters, callingMember, callingClass ?? new DefaultClass(new DefaultCompilationUnit(projectContent), "__Dummy")); + return amrt; } else { throw new NotSupportedException("unknown reference type: " + reference.ToString()); } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs index b22907b257..108501b8b8 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs @@ -82,7 +82,8 @@ namespace Grunwald.BooBinding.CodeCompletion public override void OnYieldStatement(YieldStatement node) { noReturnStatement = false; - result = ReflectionReturnType.CreatePrimitive(typeof(System.Collections.IEnumerable)); + IClass enumerable = ProjectContentRegistry.Mscorlib.GetClass("System.Collections.Generic.IEnumerable", 1); + result = new ConstructedReturnType(enumerable.DefaultReturnType, new IReturnType[] { new InferredReturnType(node.Expression, context) }); } public override bool Visit(Node node) 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 db124e05e3..10f2340b08 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs @@ -291,6 +291,17 @@ namespace Grunwald.BooBinding.CodeCompletion } } else { if (resolveResult != null) { + if (resolveResult is TypeResolveResult) { + IClass rClass = (resolveResult as TypeResolveResult).ResolvedClass; + if (rClass != null) { + foreach (IClass innerClass in rClass.InnerClasses) { + if (IsSameName(innerClass.Name, node.Name)) { + MakeTypeResult(innerClass); + return; + } + } + } + } ResolveMember(resolveResult.ResolvedType, node.Name); } } @@ -531,8 +542,6 @@ namespace Grunwald.BooBinding.CodeCompletion case BinaryOperatorType.Member: case BinaryOperatorType.NotMatch: case BinaryOperatorType.NotMember: - case BinaryOperatorType.Or: - case BinaryOperatorType.And: case BinaryOperatorType.ReferenceEquality: case BinaryOperatorType.ReferenceInequality: case BinaryOperatorType.TypeTest: @@ -566,7 +575,15 @@ namespace Grunwald.BooBinding.CodeCompletion public override void OnCallableBlockExpression(CallableBlockExpression node) { - MakeResult(new AnonymousMethodReturnType()); + AnonymousMethodReturnType amrt = new AnonymousMethodReturnType(cu); + if (node.ReturnType != null) { + amrt.MethodReturnType = ConvertType(node.ReturnType); + } else { + + amrt.MethodReturnType = new InferredReturnType(node.Body, resolver.CallingClass); + } + ConvertVisitor.AddParameters(node.Parameters, amrt.MethodParameters, resolver.CallingMember, resolver.CallingClass ?? new DefaultClass(resolver.CompilationUnit, "__Dummy")); + MakeResult(amrt); } public override void OnCallableTypeReference(CallableTypeReference node) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs index a300b118d6..fe3d985e40 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs @@ -26,9 +26,28 @@ namespace Grunwald.BooBinding.CodeCompletion DeclarationFound(node.Declaration.Name, node.Declaration.Type, node.Initializer, node.LexicalInfo); } - public override void OnParameterDeclaration(ParameterDeclaration node) + LexicalInfo GetEndSourceLocation(Node node) + { + if (node.LexicalInfo.IsValid) return node.LexicalInfo; + if (node is CallableBlockExpression) { + return GetEndSourceLocation((node as CallableBlockExpression).Body); + } else if (node is Block) { + StatementCollection st = (node as Block).Statements; + if (st.Count > 0) { + return GetEndSourceLocation(st[st.Count - 1]); + } + } + return node.LexicalInfo; + } + + public override void OnCallableBlockExpression(CallableBlockExpression node) { - DeclarationFound(node.Name, node.Type, null, node.LexicalInfo); + if (node.LexicalInfo.Line <= resolver.CaretLine && GetEndSourceLocation(node).Line >= resolver.CaretLine - 1) { + foreach (ParameterDeclaration param in node.Parameters) { + DeclarationFound(param.Name, param.Type, null, param.LexicalInfo); + } + base.OnCallableBlockExpression(node); + } } protected override void OnError(Node node, Exception error) @@ -51,7 +70,7 @@ namespace Grunwald.BooBinding.CodeCompletion public override void OnForStatement(ForStatement node) { - if (node.LexicalInfo.Line <= resolver.CaretLine && node.Block.EndSourceLocation.Line >= resolver.CaretLine - 1) { + if (node.LexicalInfo.Line <= resolver.CaretLine && GetEndSourceLocation(node).Line >= resolver.CaretLine - 1) { foreach (Declaration decl in node.Declarations) { IterationDeclarationFound(decl.Name, decl.Type, node.Iterator, node.LexicalInfo); } @@ -142,7 +161,14 @@ namespace Grunwald.BooBinding.CodeCompletion { if (expr == null) return; - IReturnType returnType = new InferredReturnType(expr, resolver.CallingClass); + // Prevent creating an infinite number of InferredReturnTypes in inferring cycles + IReturnType returnType; + if (expr.ContainsAnnotation("DomReturnType")) { + returnType = (IReturnType)expr["DomReturnType"]; + } else { + returnType = new InferredReturnType(expr, resolver.CallingClass); + expr.Annotate("DomReturnType", returnType); + } if (useElementType) returnType = new ElementReturnType(returnType); result = new DefaultField.LocalVariableField(returnType, name, diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/BooBinding.Tests.csproj b/src/AddIns/BackendBindings/Boo/BooBinding/Test/BooBinding.Tests.csproj new file mode 100644 index 0000000000..c507a76e3f --- /dev/null +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/BooBinding.Tests.csproj @@ -0,0 +1,74 @@ + + + Library + Grunwald.BooBinding.Tests + BooBinding.Tests + Debug + AnyCPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713} + ..\..\..\..\..\..\bin\UnitTests\ + False + False + False + Auto + 4194304 + AnyCPU + 4096 + 4 + false + + + obj\ + obj\Debug\ + False + DEBUG;TRACE + true + Full + True + + + obj\ + obj\Release\ + True + TRACE + False + None + False + + + + + + + + + + + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + + + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} + ICSharpCode.Core + + + {4AC2D5F1-F671-480C-A075-6BF62B3721B2} + BooBinding + + + log4net.dll + Always + + + ICSharpCode.Core.dll + Always + + + ICSharpCode.SharpDevelop.dll + Always + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs new file mode 100644 index 0000000000..84a612f889 --- /dev/null +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -0,0 +1,142 @@ +/* + * Created by SharpDevelop. + * User: Daniel Grunwald + * Date: 23.04.2006 + * Time: 11:33 + */ + +using System; +using NUnit.Framework; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Dom; +using Grunwald.BooBinding.CodeCompletion; + +namespace Grunwald.BooBinding.Tests +{ + [TestFixture] + public class ResolverTests + { + T Resolve(string code) where T : ResolveResult + { + return Resolve(code, "/*1*/"); + } + + T Resolve(string code, string marker) where T : ResolveResult + { + ResolveResult rr = Resolve(prog, new ExpressionResult(code), marker); + Assert.IsNotNull(rr, "Resolve must not return null"); + Assert.IsInstanceOfType(typeof(T), rr, "Resolve must return instance of type " + typeof(T).Name); + return (T)rr; + } + + ResolveResult Resolve(string prog, ExpressionResult er, string marker) + { + const string fileName = "tempFile.boo"; + DefaultProjectContent pc = new DefaultProjectContent(); + ParserService.ForceProjectContent(pc); + pc.ReferencedContents.Add(ProjectContentRegistry.Mscorlib); + pc.ReferencedContents.Add(ProjectContentRegistry.WinForms); + ICompilationUnit cu = new BooParser().Parse(pc, fileName, prog); + ParserService.UpdateParseInformation(cu, fileName, false, false); + cu.Classes.ForEach(pc.AddClassToNamespaceList); + + int index = prog.IndexOf(marker); + int line = 1; + int column = 0; + for (int i = 0; i < index; i++) { + column++; + if (prog[i]=='\n') { + line++; + column = 0; + } + } + + BooResolver r = new BooResolver(); + return r.Resolve(er, line, column, fileName, prog); + } + + const string prog = + "import System\n" + + "def MyMethod(arg as string):\n" + + "\tlocalVar = arg\n" + + "\t/*1*/\n" + + "\tclosure = { e as string | arg.IndexOf(e) /*inClosure*/ }\n" + + "\tindex = closure('.')\n" + + "\t/*2*/\n" + + "\tclosure2 = def(e as DateTime):\n" + + "\t\treturn e.Year\n" + + "\trecursiveClosure = def():\n" + + "\t\treturn recursiveClosure()\n" + + "\t/*3*/\n"; + + [Test] + public void MethodParameter() + { + LocalResolveResult rr = Resolve("arg"); + Assert.IsTrue(rr.IsParameter); + Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName); + } + + [Test] + public void LocalVariable() + { + LocalResolveResult rr = Resolve("localVar"); + Assert.IsFalse(rr.IsParameter); + Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName); + } + + [Test] + public void NullCoalescing() + { + ResolveResult rr = Resolve("localVar or arg"); + Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName); + } + + [Test] + public void InnerClassEnum() + { + TypeResolveResult trr = Resolve("Environment.SpecialFolder"); + Assert.AreEqual("System.Environment.SpecialFolder", trr.ResolvedClass.FullyQualifiedName); + + MemberResolveResult mrr = Resolve("Environment.SpecialFolder.Desktop"); + Assert.AreEqual("System.Environment.SpecialFolder.Desktop", mrr.ResolvedMember.FullyQualifiedName); + } + + [Test] + public void ClosureParameter() + { + LocalResolveResult rr = Resolve("e", "/*inClosure*/"); + Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName); + + Assert.IsNull(Resolve(prog, new ExpressionResult("e"), "/*1*/")); + } + + [Test] + public void ClosureCall() + { + LocalResolveResult rr = Resolve("closure('.')", "/*2*/"); + Assert.IsFalse(rr.IsParameter); + Assert.AreEqual("closure", rr.Field.Name); + Assert.AreEqual("System.Int32", rr.ResolvedType.FullyQualifiedName); + } + + [Test] + public void ClosureCall2() + { + LocalResolveResult rr = Resolve("closure2(DateTime.Now)", "/*3*/"); + Assert.IsFalse(rr.IsParameter); + Assert.AreEqual("closure2", rr.Field.Name); + Assert.AreEqual("System.Int32", rr.ResolvedType.FullyQualifiedName); + } + + [Test] + public void RecursiveClosure() + { + // Code-completion cannot work here, test if SharpDevelop is correctly + // preventing the StackOverflow. + LocalResolveResult rr = Resolve("recursiveClosure", "/*3*/"); + Assert.IsFalse(rr.IsParameter); + Assert.AreEqual("delegate():?", rr.ResolvedType.FullyQualifiedName); + } + } +} diff --git a/src/AddIns/Misc/HtmlHelp2/Project/src/Service/Help2RegistryWalker.cs b/src/AddIns/Misc/HtmlHelp2/Project/src/Service/Help2RegistryWalker.cs index 4ac8e42c21..ddfc832141 100644 --- a/src/AddIns/Misc/HtmlHelp2/Project/src/Service/Help2RegistryWalker.cs +++ b/src/AddIns/Misc/HtmlHelp2/Project/src/Service/Help2RegistryWalker.cs @@ -55,9 +55,9 @@ namespace HtmlHelp2.RegistryWalker else help2Collections.SelectedIndex = 0; } - catch + catch(Exception ex) { - LoggingService.Error("Help 2.0: cannot build namespaces list for Options dialog"); + LoggingService.Error("Help 2.0: cannot build namespaces list for Options dialog", ex); } help2Collections.EndUpdate(); diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Ime.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Ime.cs index 8334f73a76..bf5b3012ca 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Ime.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Ime.cs @@ -8,6 +8,7 @@ using System; using System.Runtime.InteropServices; using System.Drawing; +using System.Windows.Forms; namespace ICSharpCode.TextEditor { @@ -31,15 +32,11 @@ namespace ICSharpCode.TextEditor return font; } set { - if (font == null) { + if (!value.Equals(font)) { font = value; lf = null; + SetIMEWindowFont(value); } - else if (font.Equals(value) == false) { - font = value; - lf = null; - } - SetIMEWindowFont(value); } } @@ -113,25 +110,33 @@ namespace ICSharpCode.TextEditor } private const int IMC_SETCOMPOSITIONFONT = 0x000a; LOGFONT lf = null; + static bool disableIME; private void SetIMEWindowFont(Font f) { + if (disableIME || hIMEWnd == IntPtr.Zero) return; + if (lf == null) { lf = new LOGFONT(); f.ToLogFont(lf); lf.lfFaceName = f.Name; // This is very important! "Font.ToLogFont" Method sets invalid value to LOGFONT.lfFaceName } - SendMessage( - hIMEWnd, - WM_IME_CONTROL, - new IntPtr(IMC_SETCOMPOSITIONFONT), - lf - ); + try { + SendMessage( + hIMEWnd, + WM_IME_CONTROL, + new IntPtr(IMC_SETCOMPOSITIONFONT), + lf + ); + } catch (AccessViolationException ex) { + Handle(ex); + } } public void SetIMEWindowLocation(int x, int y) { + if (disableIME || hIMEWnd == IntPtr.Zero) return; POINT p = new POINT(); p.x = x; @@ -142,12 +147,25 @@ namespace ICSharpCode.TextEditor lParam.ptCurrentPos = p; lParam.rcArea = new RECT(); - SendMessage( - hIMEWnd, - WM_IME_CONTROL, - new IntPtr(IMC_SETCOMPOSITIONWINDOW), - lParam - ); + try { + SendMessage( + hIMEWnd, + WM_IME_CONTROL, + new IntPtr(IMC_SETCOMPOSITIONWINDOW), + lParam + ); + } catch (AccessViolationException ex) { + Handle(ex); + } + } + + void Handle(Exception ex) + { + Console.WriteLine(ex); + if (!disableIME) { + disableIME = true; + MessageBox.Show("Error calling IME: " + ex.Message + "\nIME is disabled.", "IME error"); + } } } } diff --git a/src/Main/Base/Project/Src/Dom/Implementations/AnonymousMethodReturnType.cs b/src/Main/Base/Project/Src/Dom/Implementations/AnonymousMethodReturnType.cs index 4a4b369e62..7e33697378 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/AnonymousMethodReturnType.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/AnonymousMethodReturnType.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; +using System.Text; using ICSharpCode.Core; namespace ICSharpCode.SharpDevelop.Dom @@ -16,15 +17,81 @@ namespace ICSharpCode.SharpDevelop.Dom /// public sealed class AnonymousMethodReturnType : ProxyReturnType { + IReturnType returnType; + List parameters = new List(); + ICompilationUnit cu; + + public AnonymousMethodReturnType(ICompilationUnit cu) + { + this.cu = cu; + } + + /// + /// Return type of the anonymous method. Can be null if inferred from context. + /// + public IReturnType MethodReturnType { + get { + return returnType; + } + set { + returnType = value; + } + } + + /// + /// Gets the list of method parameters. + /// + public IList MethodParameters { + get { + return parameters; + } + } + public override bool IsDefaultReturnType { get { return false; } } + volatile DefaultClass cachedClass; + + public override IClass GetUnderlyingClass() + { + if (cachedClass != null) return cachedClass; + DefaultClass c = new DefaultClass(cu, ClassType.Delegate, ModifierEnum.None, DomRegion.Empty, null); + c.BaseTypes.Add(ReflectionReturnType.CreatePrimitive(typeof(Delegate))); + AddDefaultDelegateMethod(c, returnType ?? ReflectionReturnType.Object, parameters); + cachedClass = c; + return c; + } + + internal static void AddDefaultDelegateMethod(DefaultClass c, IReturnType returnType, IList parameters) + { + DefaultMethod invokeMethod = new DefaultMethod("Invoke", returnType, ModifierEnum.Public, c.Region, DomRegion.Empty, c); + foreach (IParameter par in parameters) { + invokeMethod.Parameters.Add(par); + } + c.Methods.Add(invokeMethod); + invokeMethod = new DefaultMethod("BeginInvoke", CreateReturnType(typeof(IAsyncResult)), ModifierEnum.Public, c.Region, DomRegion.Empty, c); + foreach (IParameter par in parameters) { + invokeMethod.Parameters.Add(par); + } + invokeMethod.Parameters.Add(new DefaultParameter("callback", CreateReturnType(typeof(AsyncCallback)), DomRegion.Empty)); + invokeMethod.Parameters.Add(new DefaultParameter("object", ReflectionReturnType.Object, DomRegion.Empty)); + c.Methods.Add(invokeMethod); + invokeMethod = new DefaultMethod("EndInvoke", returnType, ModifierEnum.Public, c.Region, DomRegion.Empty, c); + invokeMethod.Parameters.Add(new DefaultParameter("result", CreateReturnType(typeof(IAsyncResult)), DomRegion.Empty)); + c.Methods.Add(invokeMethod); + } + + static IReturnType CreateReturnType(Type type) + { + return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, null, type, false); + } + public override IReturnType BaseType { get { - return ReflectionReturnType.Delegate; + return GetUnderlyingClass().DefaultReturnType; } } @@ -36,7 +103,22 @@ namespace ICSharpCode.SharpDevelop.Dom public override string FullyQualifiedName { get { - return Name; + StringBuilder b = new StringBuilder("delegate("); + bool first = true; + foreach (IParameter p in parameters) { + if (first) first = false; else b.Append(", "); + b.Append(p.Name); + if (p.ReturnType != null) { + b.Append(":"); + b.Append(p.ReturnType.Name); + } + } + b.Append(")"); + if (returnType != null) { + b.Append(":"); + b.Append(returnType.Name); + } + return b.ToString(); } } diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs index c77b38a92d..2a8647ec8d 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs @@ -389,25 +389,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver } currentClass.Push(c); // necessary for CreateReturnType ConvertTemplates(templates, c); - DefaultMethod invokeMethod = new DefaultMethod("Invoke", CreateReturnType(returnType), ModifierEnum.Public, c.Region, DomRegion.Empty, c); - if (parameters != null) { - foreach (AST.ParameterDeclarationExpression par in parameters) { - invokeMethod.Parameters.Add(CreateParameter(par)); - } - } - c.Methods.Add(invokeMethod); - invokeMethod = new DefaultMethod("BeginInvoke", CreateReturnType(typeof(IAsyncResult)), ModifierEnum.Public, c.Region, DomRegion.Empty, c); + + List p = new List(); if (parameters != null) { - foreach (AST.ParameterDeclarationExpression par in parameters) { - invokeMethod.Parameters.Add(CreateParameter(par)); + foreach (AST.ParameterDeclarationExpression param in parameters) { + p.Add(CreateParameter(param)); } } - invokeMethod.Parameters.Add(new DefaultParameter("callback", CreateReturnType(typeof(AsyncCallback)), DomRegion.Empty)); - invokeMethod.Parameters.Add(new DefaultParameter("object", ReflectionReturnType.Object, DomRegion.Empty)); - c.Methods.Add(invokeMethod); - invokeMethod = new DefaultMethod("EndInvoke", CreateReturnType(returnType), ModifierEnum.Public, c.Region, DomRegion.Empty, c); - invokeMethod.Parameters.Add(new DefaultParameter("result", CreateReturnType(typeof(IAsyncResult)), DomRegion.Empty)); - c.Methods.Add(invokeMethod); + AnonymousMethodReturnType.AddDefaultDelegateMethod(c, CreateReturnType(returnType), p); + currentClass.Pop(); } @@ -418,7 +408,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver IParameter CreateParameter(AST.ParameterDeclarationExpression par, IMethod method) { - IReturnType parType = CreateReturnType(par.TypeReference, method); + return CreateParameter(par, method, GetCurrentClass(), cu); + } + + internal static IParameter CreateParameter(AST.ParameterDeclarationExpression par, IMethod method, IClass currentClass, ICompilationUnit cu) + { + IReturnType parType = CreateReturnType(par.TypeReference, method, currentClass, cu); DefaultParameter p = new DefaultParameter(par.ParameterName, parType, new DomRegion(par.StartLocation, par.EndLocation)); p.Modifiers = (ParameterModifiers)par.ParamModifier; return p; @@ -597,11 +592,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver IReturnType CreateReturnType(AST.TypeReference reference, IMethod method) { - IClass c = GetCurrentClass(); - if (c == null) { + return CreateReturnType(reference, method, GetCurrentClass(), cu); + } + + static IReturnType CreateReturnType(AST.TypeReference reference, IMethod method, IClass currentClass, ICompilationUnit cu) + { + if (currentClass == null) { return TypeVisitor.CreateReturnType(reference, new DefaultClass(cu, "___DummyClass"), method, 1, 1, cu.ProjectContent, true); } else { - return TypeVisitor.CreateReturnType(reference, c, method, c.Region.BeginLine + 1, 1, cu.ProjectContent, true); + return TypeVisitor.CreateReturnType(reference, currentClass, method, currentClass.Region.BeginLine + 1, 1, cu.ProjectContent, true); } } @@ -609,10 +608,5 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver { return CreateReturnType(reference, null); } - - IReturnType CreateReturnType(Type type) - { - return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, null, type, false); - } } } diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs index 0e536b8e98..0e05c3e2e8 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs @@ -428,7 +428,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver public override object Visit(AnonymousMethodExpression anonymousMethodExpression, object data) { - return new AnonymousMethodReturnType(); + AnonymousMethodReturnType amrt = new AnonymousMethodReturnType(resolver.CompilationUnit); + foreach (ParameterDeclarationExpression param in anonymousMethodExpression.Parameters) { + amrt.MethodParameters.Add(NRefactoryASTConvertVisitor.CreateParameter(param, resolver.CallingMember as IMethod, resolver.CallingClass, resolver.CompilationUnit)); + } + return amrt; } public override object Visit(ArrayInitializerExpression arrayInitializerExpression, object data) From e0dd5e3fca2a4c1a6c1c4419377e173fdbf99a2b Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 23 Apr 2006 12:47:51 +0000 Subject: [PATCH 02/49] SD2-758. XML element and attribute completion now works for complex types defined inside an xs:all element. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1340 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/XmlSchemaCompletionData.cs | 5 +++- .../Test/Schema/AllElementTestFixture.cs | 30 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletionData.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletionData.cs index 125dc3b814..38e37bb182 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletionData.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletionData.cs @@ -794,8 +794,9 @@ namespace ICSharpCode.XmlEditor XmlSchemaSequence sequence = complexType.Particle as XmlSchemaSequence; XmlSchemaChoice choice = complexType.Particle as XmlSchemaChoice; XmlSchemaGroupRef groupRef = complexType.Particle as XmlSchemaGroupRef; + XmlSchemaAll all = complexType.Particle as XmlSchemaAll; XmlSchemaComplexContent complexContent = complexType.ContentModel as XmlSchemaComplexContent; - + if (sequence != null) { matchedElement = FindElement(sequence.Items, name); } else if (choice != null) { @@ -810,6 +811,8 @@ namespace ICSharpCode.XmlEditor } } else if (groupRef != null) { matchedElement = FindElement(groupRef, name); + } else if (all != null) { + matchedElement = FindElement(all.Items, name); } return matchedElement; diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/AllElementTestFixture.cs b/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/AllElementTestFixture.cs index 4daecf18ea..0fb2ec2593 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/AllElementTestFixture.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/AllElementTestFixture.cs @@ -21,13 +21,18 @@ namespace XmlEditor.Tests.Schema public class AllElementTestFixture : SchemaTestFixtureBase { ICompletionData[] personElementChildren; + ICompletionData[] firstNameAttributes; + ICompletionData[] firstNameElementChildren; public override void FixtureInit() { XmlElementPath path = new XmlElementPath(); path.Elements.Add(new QualifiedName("person", "http://foo")); - personElementChildren = SchemaCompletionData.GetChildElementCompletionData(path); + + path.Elements.Add(new QualifiedName("firstname", "http://foo")); + firstNameAttributes = SchemaCompletionData.GetAttributeCompletionData(path); + firstNameElementChildren = SchemaCompletionData.GetChildElementCompletionData(path); } [Test] @@ -37,13 +42,34 @@ namespace XmlEditor.Tests.Schema "Should be 2 child elements."); } + [Test] + public void FirstNameElementHasAttribute() + { + Assert.AreEqual(1, firstNameAttributes.Length, "Should have one attribute."); + } + + [Test] + public void FirstNameElementHasChildren() + { + Assert.AreEqual(2, firstNameElementChildren.Length, + "Should be 2 child elements."); + } + protected override string GetSchema() { return "\r\n" + " \r\n" + " \r\n" + " \r\n" + - " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + " \r\n" + " \r\n" + " \r\n" + From ad886431e52a7c444342c8765af91a8178aef978 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 14:31:56 +0000 Subject: [PATCH 03/49] Boo resolver unit tests now reference Boo.Lang.dll. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1341 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Boo/BooBinding/Test/ResolverTests.cs | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs index 84a612f889..e8de828d93 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -6,9 +6,11 @@ */ using System; +using System.Reflection; using NUnit.Framework; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Project; using Grunwald.BooBinding.CodeCompletion; namespace Grunwald.BooBinding.Tests @@ -16,6 +18,7 @@ namespace Grunwald.BooBinding.Tests [TestFixture] public class ResolverTests { + #region Helper T Resolve(string code) where T : ResolveResult { return Resolve(code, "/*1*/"); @@ -29,6 +32,26 @@ namespace Grunwald.BooBinding.Tests return (T)rr; } + T ResolveReg(string code) where T : ResolveResult + { + return ResolveReg(code, "/*1*/"); + } + + T ResolveReg(string code, string marker) where T : ResolveResult + { + ResolveResult rr = Resolve(regressionProg, new ExpressionResult(code), marker); + Assert.IsNotNull(rr, "Resolve must not return null"); + Assert.IsInstanceOfType(typeof(T), rr, "Resolve must return instance of type " + typeof(T).Name); + return (T)rr; + } + + IProjectContent booLangPC; + + public ResolverTests() { + booLangPC = new ReflectionProjectContent(Assembly.Load("Boo.Lang"), "Boo.Lang.dll"); + booLangPC.ReferencedContents.Add(ProjectContentRegistry.Mscorlib); + } + ResolveResult Resolve(string prog, ExpressionResult er, string marker) { const string fileName = "tempFile.boo"; @@ -36,6 +59,7 @@ namespace Grunwald.BooBinding.Tests ParserService.ForceProjectContent(pc); pc.ReferencedContents.Add(ProjectContentRegistry.Mscorlib); pc.ReferencedContents.Add(ProjectContentRegistry.WinForms); + pc.ReferencedContents.Add(booLangPC); ICompilationUnit cu = new BooParser().Parse(pc, fileName, prog); ParserService.UpdateParseInformation(cu, fileName, false, false); cu.Classes.ForEach(pc.AddClassToNamespaceList); @@ -54,6 +78,7 @@ namespace Grunwald.BooBinding.Tests BooResolver r = new BooResolver(); return r.Resolve(er, line, column, fileName, prog); } + #endregion const string prog = "import System\n" + @@ -69,6 +94,7 @@ namespace Grunwald.BooBinding.Tests "\t\treturn recursiveClosure()\n" + "\t/*3*/\n"; + #region Basic tests [Test] public void MethodParameter() { @@ -138,5 +164,37 @@ namespace Grunwald.BooBinding.Tests Assert.IsFalse(rr.IsParameter); Assert.AreEqual("delegate():?", rr.ResolvedType.FullyQualifiedName); } + #endregion + + #region Regression + const string regressionProg = + "import System\n" + + "import System.Reflection\n" + + "def MyMethod(arg as string):\n" + + "\tif true:\n" + + "\t\tboo629 = 'hello'\n" + + "\tfor boo640a in [1, 2, 3]:\n" + + "\t\tif boo640b = boo640a as FieldInfo: /*640*/\n" + + "\t\t\tprint boo640b\n" + + "\t\n" + + "\t/*1*/\n"; + + [Test] + public void Boo629VariableScope() + { + LocalResolveResult rr = ResolveReg("boo629"); + Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName); + } + + [Test] + public void Boo640ConditionalAssignment() + { + LocalResolveResult rr = ResolveReg("boo640b"); + Assert.AreEqual("System.Reflection.FieldInfo", rr.ResolvedType.FullyQualifiedName); + rr = ResolveReg("boo640a", "/*640*/"); + Assert.AreEqual("System.Object", rr.ResolvedType.FullyQualifiedName); + Assert.IsNull(Resolve(regressionProg, new ExpressionResult("boo640a"), "/*1*/")); + } + #endregion } } From 571f250ca9b7d0162cd040bdcd2201282d39954a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 14:43:56 +0000 Subject: [PATCH 04/49] InferredReturnType: use type of last ExpressionStatement for inline closures. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1342 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/CodeCompletion/ConvertVisitor.cs | 4 +-- .../Src/CodeCompletion/InferredReturnType.cs | 26 +++++++++++++++---- .../Src/CodeCompletion/ResolveVisitor.cs | 4 +-- .../Boo/BooBinding/Test/ResolverTests.cs | 2 +- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs index d38e632df6..08d411a5fa 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs @@ -280,13 +280,13 @@ namespace Grunwald.BooBinding.CodeCompletion IReturnType CreateReturnType(AST.Method node, IMethod method) { if (node.ReturnType == null) - return new InferredReturnType(node.Body, OuterClass); + return new InferredReturnType(node.Body, OuterClass, false); return CreateReturnType(node.ReturnType, method); } IReturnType CreateReturnType(AST.Property property) { if (property.Type == null && property.Getter != null && property.Getter.Body != null) - return new InferredReturnType(property.Getter.Body, OuterClass); + return new InferredReturnType(property.Getter.Body, OuterClass, false); return CreateReturnType(property.Type); } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs index 108501b8b8..c262c98871 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs @@ -29,9 +29,12 @@ namespace Grunwald.BooBinding.CodeCompletion this.expression = expression; } - public InferredReturnType(Block block, IClass context) + bool useLastStatementIfNoReturnStatement; + + public InferredReturnType(Block block, IClass context, bool useLastStatementIfNoReturnStatement) { if (block == null) throw new ArgumentNullException("block"); + this.useLastStatementIfNoReturnStatement = useLastStatementIfNoReturnStatement; this.block = block; this.context = context; } @@ -44,12 +47,17 @@ namespace Grunwald.BooBinding.CodeCompletion Block b = block; block = null; // reset block before calling Visit to prevent StackOverflow v.Visit(b); - if (v.noReturnStatement) - cachedType = ReflectionReturnType.Void; - else if (v.result is NullReturnType) + if (v.noReturnStatement) { + if (useLastStatementIfNoReturnStatement && v.lastExpressionStatement != null) { + cachedType = new BooResolver().GetTypeOfExpression(v.lastExpressionStatement.Expression, context); + } else { + cachedType = ReflectionReturnType.Void; + } + } else if (v.result is NullReturnType) { cachedType = ReflectionReturnType.Object; - else + } else { cachedType = v.result; + } } else if (expression != null) { Expression expr = expression; expression = null; @@ -66,8 +74,10 @@ namespace Grunwald.BooBinding.CodeCompletion { this.context = context; } + public IReturnType result; public bool noReturnStatement = true; + public ExpressionStatement lastExpressionStatement; public override void OnReturnStatement(ReturnStatement node) { @@ -79,6 +89,12 @@ namespace Grunwald.BooBinding.CodeCompletion } } + public override void OnExpressionStatement(ExpressionStatement node) + { + base.OnExpressionStatement(node); + lastExpressionStatement = node; + } + public override void OnYieldStatement(YieldStatement node) { noReturnStatement = false; 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 10f2340b08..235486c7df 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs @@ -579,8 +579,8 @@ namespace Grunwald.BooBinding.CodeCompletion if (node.ReturnType != null) { amrt.MethodReturnType = ConvertType(node.ReturnType); } else { - - amrt.MethodReturnType = new InferredReturnType(node.Body, resolver.CallingClass); + amrt.MethodReturnType = new InferredReturnType(node.Body, resolver.CallingClass, + node.ContainsAnnotation("inline")); } ConvertVisitor.AddParameters(node.Parameters, amrt.MethodParameters, resolver.CallingMember, resolver.CallingClass ?? new DefaultClass(resolver.CompilationUnit, "__Dummy")); MakeResult(amrt); diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs index e8de828d93..a453a028b4 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -80,6 +80,7 @@ namespace Grunwald.BooBinding.Tests } #endregion + #region Basic tests const string prog = "import System\n" + "def MyMethod(arg as string):\n" + @@ -94,7 +95,6 @@ namespace Grunwald.BooBinding.Tests "\t\treturn recursiveClosure()\n" + "\t/*3*/\n"; - #region Basic tests [Test] public void MethodParameter() { From 601be026a82d90061e2bbc2124f1395bdba2845f Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 15:12:42 +0000 Subject: [PATCH 05/49] When loading a solution, open files after the project content stubs were created. This fixes SD2-728 and improves solution-load-time when the DefaultProjectContent is not required. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1343 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Base/Project/Src/Project/AbstractProject.cs | 6 +++--- .../Src/Services/ParserService/ParserService.cs | 4 +++- .../Src/Services/ProjectService/ProjectService.cs | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs index 69dc09f414..953c9a54f1 100644 --- a/src/Main/Base/Project/Src/Project/AbstractProject.cs +++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs @@ -779,6 +779,8 @@ namespace ICSharpCode.SharpDevelop.Project return properties; } + internal static List filesToOpenAfterSolutionLoad = new List(); + /// /// Loads project preferences (currently opened files, bookmarks etc.). /// @@ -788,9 +790,7 @@ namespace ICSharpCode.SharpDevelop.Project ICSharpCode.SharpDevelop.Bookmarks.BookmarkManager.AddMark(mark); } foreach (string fileName in properties.Get("files", new string[0])) { - if (File.Exists(fileName)) { - FileService.OpenFile(fileName); - } + filesToOpenAfterSolutionLoad.Add(fileName); } } } diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs index a21a3805b6..c7e8b9674a 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs @@ -155,6 +155,7 @@ namespace ICSharpCode.Core ICSharpCode.Core.MessageService.ShowError(e, "Error while retrieving project contents from " + project); } } + WorkbenchSingleton.SafeThreadAsyncCall((ThreadStart)ProjectService.ParserServiceCreatedProjectContents); int workAmount = 0; foreach (ParseProjectContent newContent in createdContents) { if (abortLoadSolutionProjectsThread) return; @@ -167,7 +168,7 @@ namespace ICSharpCode.Core } StatusBarService.ProgressMonitor.BeginTask("Parsing...", workAmount); foreach (ParseProjectContent newContent in createdContents) { - if (abortLoadSolutionProjectsThread) return; + if (abortLoadSolutionProjectsThread) break; try { newContent.Initialize2(); } catch (Exception e) { @@ -182,6 +183,7 @@ namespace ICSharpCode.Core ParseProjectContent newContent = (ParseProjectContent)state; newContent.Initialize1(); newContent.Initialize2(); + StatusBarService.ProgressMonitor.Done(); } internal static IProjectContent CreateProjectContentForAddedProject(IProject project) diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs index c01aadeec8..0bca7a9fbe 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs @@ -230,6 +230,7 @@ namespace ICSharpCode.SharpDevelop.Project MessageService.ShowError(ex.Message); return; } + AbstractProject.filesToOpenAfterSolutionLoad.Clear(); try { string file = GetPreferenceFileName(openSolution.FileName); if (FileUtility.IsValidFileName(file) && File.Exists(file)) { @@ -239,11 +240,24 @@ namespace ICSharpCode.SharpDevelop.Project } catch (Exception ex) { MessageService.ShowError(ex); } + // Create project contents for solution + ParserService.OnSolutionLoaded(); + // preferences must be read before OnSolutionLoad is called to enable // the event listeners to read e.Solution.Preferences.Properties OnSolutionLoaded(new SolutionEventArgs(openSolution)); } + internal static void ParserServiceCreatedProjectContents() + { + foreach (string file in AbstractProject.filesToOpenAfterSolutionLoad) { + if (File.Exists(file)) { + FileService.OpenFile(file); + } + } + AbstractProject.filesToOpenAfterSolutionLoad.Clear(); + } + static void ApplyConfigurationAndReadPreferences() { openSolution.ApplySolutionConfigurationToProjects(); @@ -396,7 +410,6 @@ namespace ICSharpCode.SharpDevelop.Project static void OnSolutionLoaded(SolutionEventArgs e) { - ParserService.OnSolutionLoaded(); if (SolutionLoaded != null) { SolutionLoaded(null, e); } From ae481755b4cb3aefb558b617efc90f995fb98cd6 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 15:31:39 +0000 Subject: [PATCH 06/49] Fixed SD2-778: Indent (Ctrl+I) should be put into main menu git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1344 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- AddIns/ICSharpCode.SharpDevelop.addin | 70 ++++++++++++++------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index d8acdbf404..e0f0b290ad 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -537,10 +537,10 @@ - + + label = "${res:ProjectComponent.ContextMenu.AddWebReference}" + class = "ICSharpCode.SharpDevelop.Project.Commands.AddWebReferenceToProject"/> - + + class = "ICSharpCode.SharpDevelop.Project.Commands.RefreshWebReference"/> + icon = "Icons.16x16.PropertiesIcon" + label = "${res:XML.MainMenu.FormatMenu.ShowProperties}" + class = "ICSharpCode.SharpDevelop.Project.Commands.ShowPropertiesForNode"/> @@ -933,9 +933,9 @@ class = "ICSharpCode.SharpDevelop.Commands.TabStrip.SaveFileAsTab"/> + icon = "Icons.16x16.SaveAllIcon" + label = "${res:XML.MainMenu.FileMenu.SaveAll.Description}" + class = "ICSharpCode.SharpDevelop.Commands.SaveAllFiles"/> @@ -1007,15 +1007,15 @@ + label = "${res:SideBarComponent.ContextMenu.RenameTab}" + class = "ICSharpCode.SharpDevelop.Commands.SideBarRenameTabHeader"/> - + - + + label = "${res:SideBarComponent.ContextMenu.DeleteTabItem}" + class = "ICSharpCode.SharpDevelop.Commands.SideBarDeleteTabItem"/> + label = "${res:SideBarComponent.ContextMenu.RenameTabItem}" + class = "ICSharpCode.SharpDevelop.Commands.SideBarRenameTabItem" /> + label = "${res:SideBarComponent.ContextMenu.MoveTabItemUp}" + class = "ICSharpCode.SharpDevelop.Commands.SideBarMoveActiveItemUp"/> + label = "${res:SideBarComponent.ContextMenu.MoveTabItemDown}" + class = "ICSharpCode.SharpDevelop.Commands.SideBarMoveActiveItemDown"/> @@ -1276,8 +1276,8 @@ label = "${res:ProjectComponent.ContextMenu.AddReference}" class = "ICSharpCode.SharpDevelop.Project.Commands.AddReferenceToProject"/> + label = "${res:ProjectComponent.ContextMenu.AddWebReference}" + class = "ICSharpCode.SharpDevelop.Project.Commands.AddWebReferenceToProject"/> @@ -1576,7 +1576,7 @@ - + @@ -1609,7 +1609,7 @@ class = "ICSharpCode.SharpDevelop.Refactoring.RenameLocalVariableCommand"/> + class = "ICSharpCode.SharpDevelop.Refactoring.FindLocalVariableReferencesCommand"/> @@ -1651,10 +1651,6 @@ icon = "Icons.16x16.CommentRegion" label = "${res:XML.TextAreaContextMenu.CommentUncommentSelection}" class= "ICSharpCode.SharpDevelop.DefaultEditor.Commands.CommentRegion"/> - + + + @@ -1930,7 +1935,6 @@ - From a98a281951b80379d44016bf779ab202d0502f55 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 15:52:17 +0000 Subject: [PATCH 07/49] Fixed SD2-781: Null exception when adding new item to project Fixed SD2-776: Warn when creating a new file while project is open git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1345 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Base/Project/Src/Commands/FileCommands.cs | 19 +++++++++++++++---- .../Commands/FolderNodeCommands.cs | 7 ++++--- .../Pads/ProjectBrowser/ProjectBrowserPad.cs | 1 + 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/Main/Base/Project/Src/Commands/FileCommands.cs b/src/Main/Base/Project/Src/Commands/FileCommands.cs index 2e63898ee8..4e6f072de9 100644 --- a/src/Main/Base/Project/Src/Commands/FileCommands.cs +++ b/src/Main/Base/Project/Src/Commands/FileCommands.cs @@ -25,6 +25,17 @@ namespace ICSharpCode.SharpDevelop.Commands { public override void Run() { + if (ProjectService.CurrentProject != null) { + if (MessageService.ShowCustomDialog("${res:Dialog.NewFile.AddToProjectQuestion}", + "${res:Dialog.NewFile.AddToProjectQuestionTitle}", + "${res:Dialog.NewFile.AddToProjectQuestionProject}", + "${res:Dialog.NewFile.AddToProjectQuestionStandalone}") + == 1) + { + new Project.Commands.AddNewItemsToProject().Run(); + return; + } + } using (NewFileDialog nfd = new NewFileDialog(null)) { nfd.Owner = (Form)WorkbenchSingleton.Workbench; nfd.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); @@ -164,7 +175,7 @@ namespace ICSharpCode.SharpDevelop.Commands fdiag.AddExtension = true; fdiag.Filter = String.Join("|", (string[])(AddInTree.GetTreeNode("/SharpDevelop/Workbench/FileFilter").BuildChildItems(null)).ToArray(typeof(string))); - + if (fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { string fileName = fdiag.FileName; // currently useless, because the fdiag.FileName can't @@ -247,7 +258,7 @@ namespace ICSharpCode.SharpDevelop.Commands public class ExitWorkbenchCommand : AbstractMenuCommand { public override void Run() - { + { ((Form)WorkbenchSingleton.Workbench).Close(); } } @@ -312,7 +323,7 @@ namespace ICSharpCode.SharpDevelop.Commands public class ClearRecentFiles : AbstractMenuCommand { public override void Run() - { + { try { FileService.RecentOpen.ClearRecentFiles(); @@ -323,7 +334,7 @@ namespace ICSharpCode.SharpDevelop.Commands public class ClearRecentProjects : AbstractMenuCommand { public override void Run() - { + { try { FileService.RecentOpen.ClearRecentProjects(); diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs index 96d25bd102..27f21810c7 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs @@ -263,9 +263,10 @@ namespace ICSharpCode.SharpDevelop.Project.Commands public override void Run() { TreeNode selectedNode = ProjectBrowserPad.Instance.ProjectBrowserControl.SelectedNode; - DirectoryNode node = selectedNode as DirectoryNode; - if (node == null) { - node = selectedNode.Parent as DirectoryNode; + DirectoryNode node = null; + while (selectedNode != null && node == null) { + node = selectedNode as DirectoryNode; + selectedNode = selectedNode.Parent; } if (node == null) { return; diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs index 2051b9dd1e..89c1a23955 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs @@ -72,6 +72,7 @@ namespace ICSharpCode.SharpDevelop.Project if (ProjectService.OpenSolution != null) { ProjectServiceSolutionLoaded(null, new SolutionEventArgs(ProjectService.OpenSolution)); } + ActiveWindowChanged(null, null); } public void StartLabelEdit(ExtTreeNode node) From db253755b8b985c78f6e63ec1f15d4bcde71f13e Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 16:31:40 +0000 Subject: [PATCH 08/49] Fixed SD2-571: Folding classes hides the declaration line git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1346 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../NRefactoryASTGenerator/AST/GlobalLevel.cs | 1 + .../Src/Parser/AST/General/CompilationUnit.cs | 6 + .../Project/Src/Parser/AST/Generated.cs | 16 +- .../Project/Src/Parser/CSharp/Parser.cs | 1932 ++++++++-------- .../Project/Src/Parser/CSharp/cs.ATG | 17 +- .../Project/Src/Parser/VBNet/Parser.cs | 1969 +++++++++-------- .../Project/Src/Parser/VBNet/VBNET.ATG | 11 +- .../NRefactory/Project/Src/Parser/gen.bat | 2 + .../GlobalScope/TypeDeclarationTests.cs | 16 +- src/Main/Base/Project/Src/Dom/IClass.cs | 7 + src/Main/Base/Project/Src/Dom/IMember.cs | 3 + .../Src/Dom/Implementations/DefaultClass.cs | 10 + .../NRefactoryASTConvertVisitor.cs | 26 +- .../Gui/Editor/ParserFoldingStrategy.cs | 8 +- 14 files changed, 2065 insertions(+), 1959 deletions(-) diff --git a/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/GlobalLevel.cs b/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/GlobalLevel.cs index 1386a08155..3760f26e91 100644 --- a/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/GlobalLevel.cs +++ b/src/Libraries/NRefactory/NRefactoryASTGenerator/AST/GlobalLevel.cs @@ -55,6 +55,7 @@ namespace NRefactoryASTGenerator.AST ClassType type; List baseTypes; List templates; + Point bodyStartLocation; public TypeDeclaration(Modifier modifier, List attributes) : base(modifier, attributes) {} } diff --git a/src/Libraries/NRefactory/Project/Src/Parser/AST/General/CompilationUnit.cs b/src/Libraries/NRefactory/Project/Src/Parser/AST/General/CompilationUnit.cs index b8c98a30ac..d5958235bc 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/AST/General/CompilationUnit.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/AST/General/CompilationUnit.cs @@ -34,6 +34,12 @@ namespace ICSharpCode.NRefactory.Parser.AST blockStack.Pop(); } + public INode CurrentBock { + get { + return blockStack.Count > 0 ? (INode)blockStack.Peek() : null; + } + } + public override void AddChild(INode childNode) { if (childNode != null) { diff --git a/src/Libraries/NRefactory/Project/Src/Parser/AST/Generated.cs b/src/Libraries/NRefactory/Project/Src/Parser/AST/Generated.cs index e4bf8c6883..f9098a57ff 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/AST/Generated.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/AST/Generated.cs @@ -3806,6 +3806,8 @@ namespace ICSharpCode.NRefactory.Parser.AST { List templates; + Point bodyStartLocation; + public string Name { get { return name; @@ -3842,12 +3844,22 @@ namespace ICSharpCode.NRefactory.Parser.AST { } } + public Point BodyStartLocation { + get { + return bodyStartLocation; + } + set { + bodyStartLocation = value; + } + } + public TypeDeclaration(Modifier modifier, List attributes) : base(attributes) { Modifier = modifier; name = ""; baseTypes = new List(); templates = new List(); + bodyStartLocation = new Point(-1, -1); } public override object AcceptVisitor(IAstVisitor visitor, object data) { @@ -3855,8 +3867,8 @@ namespace ICSharpCode.NRefactory.Parser.AST { } public override string ToString() { - return string.Format("[TypeDeclaration Name={0} Type={1} BaseTypes={2} Templates={3} Attributes={4} Mod" + - "ifier={5}]", Name, Type, GetCollectionString(BaseTypes), GetCollectionString(Templates), GetCollectionString(Attributes), Modifier); + return string.Format("[TypeDeclaration Name={0} Type={1} BaseTypes={2} Templates={3} BodyStartLocation=" + + "{4} Attributes={5} Modifier={6}]", Name, Type, GetCollectionString(BaseTypes), GetCollectionString(Templates), BodyStartLocation, GetCollectionString(Attributes), Modifier); } } diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs index 19ada8eef1..6ca859f3cc 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs @@ -694,70 +694,70 @@ m, attributes); } void Qualident( -#line 931 "cs.ATG" +#line 935 "cs.ATG" out string qualident) { Expect(1); -#line 933 "cs.ATG" +#line 937 "cs.ATG" qualidentBuilder.Length = 0; qualidentBuilder.Append(t.val); while ( -#line 934 "cs.ATG" +#line 938 "cs.ATG" DotAndIdent()) { Expect(15); Expect(1); -#line 934 "cs.ATG" +#line 938 "cs.ATG" qualidentBuilder.Append('.'); qualidentBuilder.Append(t.val); } -#line 937 "cs.ATG" +#line 941 "cs.ATG" qualident = qualidentBuilder.ToString(); } void NonArrayType( -#line 1041 "cs.ATG" +#line 1050 "cs.ATG" out TypeReference type) { -#line 1043 "cs.ATG" +#line 1052 "cs.ATG" string name; int pointer = 0; type = null; if (la.kind == 1 || la.kind == 90 || la.kind == 107) { ClassType( -#line 1048 "cs.ATG" +#line 1057 "cs.ATG" out type, false); } else if (StartOf(4)) { SimpleType( -#line 1049 "cs.ATG" +#line 1058 "cs.ATG" out name); -#line 1049 "cs.ATG" +#line 1058 "cs.ATG" type = new TypeReference(name); } else if (la.kind == 122) { lexer.NextToken(); Expect(6); -#line 1050 "cs.ATG" +#line 1059 "cs.ATG" pointer = 1; type = new TypeReference("void"); } else SynErr(127); if (la.kind == 12) { NullableQuestionMark( -#line 1053 "cs.ATG" +#line 1062 "cs.ATG" ref type); } while ( -#line 1055 "cs.ATG" +#line 1064 "cs.ATG" IsPointer()) { Expect(6); -#line 1056 "cs.ATG" +#line 1065 "cs.ATG" ++pointer; } -#line 1058 "cs.ATG" +#line 1067 "cs.ATG" if (type != null) { type.PointerNestingLevel = pointer; } } @@ -862,60 +862,60 @@ out expr); } void Expr( -#line 2077 "cs.ATG" +#line 2086 "cs.ATG" out Expression expr) { -#line 2078 "cs.ATG" +#line 2087 "cs.ATG" expr = null; Expression expr1 = null, expr2 = null; AssignmentOperatorType op; UnaryExpr( -#line 2080 "cs.ATG" +#line 2089 "cs.ATG" out expr); if (StartOf(6)) { AssignmentOperator( -#line 2083 "cs.ATG" +#line 2092 "cs.ATG" out op); Expr( -#line 2083 "cs.ATG" +#line 2092 "cs.ATG" out expr1); -#line 2083 "cs.ATG" +#line 2092 "cs.ATG" expr = new AssignmentExpression(expr, op, expr1); } else if ( -#line 2084 "cs.ATG" +#line 2093 "cs.ATG" la.kind == Tokens.GreaterThan && Peek(1).kind == Tokens.GreaterEqual) { AssignmentOperator( -#line 2085 "cs.ATG" +#line 2094 "cs.ATG" out op); Expr( -#line 2085 "cs.ATG" +#line 2094 "cs.ATG" out expr1); -#line 2085 "cs.ATG" +#line 2094 "cs.ATG" expr = new AssignmentExpression(expr, op, expr1); } else if (StartOf(7)) { ConditionalOrExpr( -#line 2087 "cs.ATG" +#line 2096 "cs.ATG" ref expr); if (la.kind == 13) { lexer.NextToken(); Expr( -#line 2088 "cs.ATG" +#line 2097 "cs.ATG" out expr1); -#line 2088 "cs.ATG" +#line 2097 "cs.ATG" expr = new BinaryOperatorExpression(expr, BinaryOperatorType.NullCoalescing, expr1); } if (la.kind == 12) { lexer.NextToken(); Expr( -#line 2089 "cs.ATG" +#line 2098 "cs.ATG" out expr1); Expect(9); Expr( -#line 2089 "cs.ATG" +#line 2098 "cs.ATG" out expr2); -#line 2089 "cs.ATG" +#line 2098 "cs.ATG" expr = new ConditionalExpression(expr, expr1, expr2); } } else SynErr(129); @@ -992,76 +992,76 @@ out attribute); } void TypeModifier( -#line 1128 "cs.ATG" +#line 1137 "cs.ATG" Modifiers m) { switch (la.kind) { case 88: { lexer.NextToken(); -#line 1130 "cs.ATG" +#line 1139 "cs.ATG" m.Add(Modifier.New, t.Location); break; } case 97: { lexer.NextToken(); -#line 1131 "cs.ATG" +#line 1140 "cs.ATG" m.Add(Modifier.Public, t.Location); break; } case 96: { lexer.NextToken(); -#line 1132 "cs.ATG" +#line 1141 "cs.ATG" m.Add(Modifier.Protected, t.Location); break; } case 83: { lexer.NextToken(); -#line 1133 "cs.ATG" +#line 1142 "cs.ATG" m.Add(Modifier.Internal, t.Location); break; } case 95: { lexer.NextToken(); -#line 1134 "cs.ATG" +#line 1143 "cs.ATG" m.Add(Modifier.Private, t.Location); break; } case 118: { lexer.NextToken(); -#line 1135 "cs.ATG" +#line 1144 "cs.ATG" m.Add(Modifier.Unsafe, t.Location); break; } case 48: { lexer.NextToken(); -#line 1136 "cs.ATG" +#line 1145 "cs.ATG" m.Add(Modifier.Abstract, t.Location); break; } case 102: { lexer.NextToken(); -#line 1137 "cs.ATG" +#line 1146 "cs.ATG" m.Add(Modifier.Sealed, t.Location); break; } case 106: { lexer.NextToken(); -#line 1138 "cs.ATG" +#line 1147 "cs.ATG" m.Add(Modifier.Static, t.Location); break; } case 1: { lexer.NextToken(); -#line 1139 "cs.ATG" +#line 1148 "cs.ATG" if (t.val == "partial") { m.Add(Modifier.Partial, t.Location); } else { Error("Unexpected identifier"); } break; } @@ -1119,23 +1119,26 @@ IdentIsWhere()) { #line 841 "cs.ATG" templates); } + +#line 843 "cs.ATG" + newType.BodyStartLocation = t.EndLocation; ClassBody(); if (la.kind == 11) { lexer.NextToken(); } -#line 844 "cs.ATG" +#line 845 "cs.ATG" newType.EndLocation = t.Location; compilationUnit.BlockEnd(); } else if (StartOf(8)) { -#line 847 "cs.ATG" +#line 848 "cs.ATG" m.Check(Modifier.StructsInterfacesEnumsDelegates); if (la.kind == 108) { lexer.NextToken(); -#line 848 "cs.ATG" +#line 849 "cs.ATG" TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); templates = newType.Templates; newType.StartLocation = m.GetDeclarationLocation(t.Location); @@ -1145,41 +1148,44 @@ templates); Expect(1); -#line 855 "cs.ATG" +#line 856 "cs.ATG" newType.Name = t.val; if (la.kind == 23) { TypeParameterList( -#line 858 "cs.ATG" +#line 859 "cs.ATG" templates); } if (la.kind == 9) { StructInterfaces( -#line 860 "cs.ATG" +#line 861 "cs.ATG" out names); -#line 860 "cs.ATG" +#line 861 "cs.ATG" newType.BaseTypes = names; } while ( -#line 863 "cs.ATG" +#line 864 "cs.ATG" IdentIsWhere()) { TypeParameterConstraintsClause( -#line 863 "cs.ATG" +#line 864 "cs.ATG" templates); } + +#line 867 "cs.ATG" + newType.BodyStartLocation = t.EndLocation; StructBody(); if (la.kind == 11) { lexer.NextToken(); } -#line 867 "cs.ATG" +#line 869 "cs.ATG" newType.EndLocation = t.Location; compilationUnit.BlockEnd(); } else if (la.kind == 82) { lexer.NextToken(); -#line 871 "cs.ATG" +#line 873 "cs.ATG" TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); templates = newType.Templates; compilationUnit.AddChild(newType); @@ -1189,41 +1195,44 @@ templates); Expect(1); -#line 878 "cs.ATG" +#line 880 "cs.ATG" newType.Name = t.val; if (la.kind == 23) { TypeParameterList( -#line 881 "cs.ATG" +#line 883 "cs.ATG" templates); } if (la.kind == 9) { InterfaceBase( -#line 883 "cs.ATG" +#line 885 "cs.ATG" out names); -#line 883 "cs.ATG" +#line 885 "cs.ATG" newType.BaseTypes = names; } while ( -#line 886 "cs.ATG" +#line 888 "cs.ATG" IdentIsWhere()) { TypeParameterConstraintsClause( -#line 886 "cs.ATG" +#line 888 "cs.ATG" templates); } + +#line 890 "cs.ATG" + newType.BodyStartLocation = t.EndLocation; InterfaceBody(); if (la.kind == 11) { lexer.NextToken(); } -#line 889 "cs.ATG" +#line 892 "cs.ATG" newType.EndLocation = t.Location; compilationUnit.BlockEnd(); } else if (la.kind == 67) { lexer.NextToken(); -#line 893 "cs.ATG" +#line 896 "cs.ATG" TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); compilationUnit.AddChild(newType); compilationUnit.BlockStart(newType); @@ -1232,78 +1241,81 @@ templates); Expect(1); -#line 899 "cs.ATG" +#line 902 "cs.ATG" newType.Name = t.val; if (la.kind == 9) { lexer.NextToken(); IntegralType( -#line 900 "cs.ATG" +#line 903 "cs.ATG" out name); -#line 900 "cs.ATG" +#line 903 "cs.ATG" newType.BaseTypes.Add(new TypeReference(name)); } + +#line 905 "cs.ATG" + newType.BodyStartLocation = t.EndLocation; EnumBody(); if (la.kind == 11) { lexer.NextToken(); } -#line 903 "cs.ATG" +#line 907 "cs.ATG" newType.EndLocation = t.Location; compilationUnit.BlockEnd(); } else { lexer.NextToken(); -#line 907 "cs.ATG" +#line 911 "cs.ATG" DelegateDeclaration delegateDeclr = new DelegateDeclaration(m.Modifier, attributes); templates = delegateDeclr.Templates; delegateDeclr.StartLocation = m.GetDeclarationLocation(t.Location); if ( -#line 911 "cs.ATG" +#line 915 "cs.ATG" NotVoidPointer()) { Expect(122); -#line 911 "cs.ATG" +#line 915 "cs.ATG" delegateDeclr.ReturnType = new TypeReference("void", 0, null); } else if (StartOf(9)) { Type( -#line 912 "cs.ATG" +#line 916 "cs.ATG" out type); -#line 912 "cs.ATG" +#line 916 "cs.ATG" delegateDeclr.ReturnType = type; } else SynErr(131); Expect(1); -#line 914 "cs.ATG" +#line 918 "cs.ATG" delegateDeclr.Name = t.val; if (la.kind == 23) { TypeParameterList( -#line 917 "cs.ATG" +#line 921 "cs.ATG" templates); } Expect(20); if (StartOf(10)) { FormalParameterList( -#line 919 "cs.ATG" +#line 923 "cs.ATG" p); -#line 919 "cs.ATG" +#line 923 "cs.ATG" delegateDeclr.Parameters = p; } Expect(21); while ( -#line 923 "cs.ATG" +#line 927 "cs.ATG" IdentIsWhere()) { TypeParameterConstraintsClause( -#line 923 "cs.ATG" +#line 927 "cs.ATG" templates); } Expect(11); -#line 925 "cs.ATG" +#line 929 "cs.ATG" delegateDeclr.EndLocation = t.Location; compilationUnit.AddChild(delegateDeclr); @@ -1312,90 +1324,90 @@ templates); } void TypeParameterList( -#line 2480 "cs.ATG" +#line 2489 "cs.ATG" List templates) { -#line 2482 "cs.ATG" +#line 2491 "cs.ATG" AttributeSection section; List attributes = new List(); Expect(23); while (la.kind == 18) { AttributeSection( -#line 2486 "cs.ATG" +#line 2495 "cs.ATG" out section); -#line 2486 "cs.ATG" +#line 2495 "cs.ATG" attributes.Add(section); } Expect(1); -#line 2487 "cs.ATG" +#line 2496 "cs.ATG" templates.Add(new TemplateDefinition(t.val, attributes)); while (la.kind == 14) { lexer.NextToken(); while (la.kind == 18) { AttributeSection( -#line 2488 "cs.ATG" +#line 2497 "cs.ATG" out section); -#line 2488 "cs.ATG" +#line 2497 "cs.ATG" attributes.Add(section); } Expect(1); -#line 2489 "cs.ATG" +#line 2498 "cs.ATG" templates.Add(new TemplateDefinition(t.val, attributes)); } Expect(22); } void ClassBase( -#line 940 "cs.ATG" +#line 944 "cs.ATG" out List names) { -#line 942 "cs.ATG" +#line 946 "cs.ATG" TypeReference typeRef; names = new List(); Expect(9); ClassType( -#line 946 "cs.ATG" +#line 950 "cs.ATG" out typeRef, false); -#line 946 "cs.ATG" +#line 950 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } while (la.kind == 14) { lexer.NextToken(); TypeName( -#line 947 "cs.ATG" +#line 951 "cs.ATG" out typeRef, false); -#line 947 "cs.ATG" +#line 951 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } } } void TypeParameterConstraintsClause( -#line 2493 "cs.ATG" +#line 2502 "cs.ATG" List templates) { -#line 2494 "cs.ATG" +#line 2503 "cs.ATG" string name = ""; TypeReference type; Expect(1); -#line 2496 "cs.ATG" +#line 2505 "cs.ATG" if (t.val != "where") Error("where expected"); Expect(1); -#line 2497 "cs.ATG" +#line 2506 "cs.ATG" name = t.val; Expect(9); TypeParameterConstraintsClauseBase( -#line 2499 "cs.ATG" +#line 2508 "cs.ATG" out type); -#line 2500 "cs.ATG" +#line 2509 "cs.ATG" TemplateDefinition td = null; foreach (TemplateDefinition d in templates) { if (d.Name == name) { @@ -1408,10 +1420,10 @@ out type); while (la.kind == 14) { lexer.NextToken(); TypeParameterConstraintsClauseBase( -#line 2509 "cs.ATG" +#line 2518 "cs.ATG" out type); -#line 2510 "cs.ATG" +#line 2519 "cs.ATG" td = null; foreach (TemplateDefinition d in templates) { if (d.Name == name) { @@ -1426,110 +1438,110 @@ out type); void ClassBody() { -#line 951 "cs.ATG" +#line 955 "cs.ATG" AttributeSection section; Expect(16); while (StartOf(11)) { -#line 954 "cs.ATG" +#line 958 "cs.ATG" List attributes = new List(); Modifiers m = new Modifiers(); while (la.kind == 18) { AttributeSection( -#line 957 "cs.ATG" +#line 961 "cs.ATG" out section); -#line 957 "cs.ATG" +#line 961 "cs.ATG" attributes.Add(section); } MemberModifiers( -#line 958 "cs.ATG" +#line 962 "cs.ATG" m); ClassMemberDecl( -#line 959 "cs.ATG" +#line 963 "cs.ATG" m, attributes); } Expect(17); } void StructInterfaces( -#line 964 "cs.ATG" +#line 968 "cs.ATG" out List names) { -#line 966 "cs.ATG" +#line 970 "cs.ATG" TypeReference typeRef; names = new List(); Expect(9); TypeName( -#line 970 "cs.ATG" +#line 974 "cs.ATG" out typeRef, false); -#line 970 "cs.ATG" +#line 974 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } while (la.kind == 14) { lexer.NextToken(); TypeName( -#line 971 "cs.ATG" +#line 975 "cs.ATG" out typeRef, false); -#line 971 "cs.ATG" +#line 975 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } } } void StructBody() { -#line 975 "cs.ATG" +#line 979 "cs.ATG" AttributeSection section; Expect(16); while (StartOf(12)) { -#line 978 "cs.ATG" +#line 982 "cs.ATG" List attributes = new List(); Modifiers m = new Modifiers(); while (la.kind == 18) { AttributeSection( -#line 981 "cs.ATG" +#line 985 "cs.ATG" out section); -#line 981 "cs.ATG" +#line 985 "cs.ATG" attributes.Add(section); } MemberModifiers( -#line 982 "cs.ATG" +#line 986 "cs.ATG" m); StructMemberDecl( -#line 983 "cs.ATG" +#line 987 "cs.ATG" m, attributes); } Expect(17); } void InterfaceBase( -#line 988 "cs.ATG" +#line 992 "cs.ATG" out List names) { -#line 990 "cs.ATG" +#line 994 "cs.ATG" TypeReference typeRef; names = new List(); Expect(9); TypeName( -#line 994 "cs.ATG" +#line 998 "cs.ATG" out typeRef, false); -#line 994 "cs.ATG" +#line 998 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } while (la.kind == 14) { lexer.NextToken(); TypeName( -#line 995 "cs.ATG" +#line 999 "cs.ATG" out typeRef, false); -#line 995 "cs.ATG" +#line 999 "cs.ATG" if (typeRef != null) { names.Add(typeRef); } } } @@ -1543,72 +1555,72 @@ out typeRef, false); } void IntegralType( -#line 1150 "cs.ATG" +#line 1159 "cs.ATG" out string name) { -#line 1150 "cs.ATG" +#line 1159 "cs.ATG" name = ""; switch (la.kind) { case 101: { lexer.NextToken(); -#line 1152 "cs.ATG" +#line 1161 "cs.ATG" name = "sbyte"; break; } case 53: { lexer.NextToken(); -#line 1153 "cs.ATG" +#line 1162 "cs.ATG" name = "byte"; break; } case 103: { lexer.NextToken(); -#line 1154 "cs.ATG" +#line 1163 "cs.ATG" name = "short"; break; } case 119: { lexer.NextToken(); -#line 1155 "cs.ATG" +#line 1164 "cs.ATG" name = "ushort"; break; } case 81: { lexer.NextToken(); -#line 1156 "cs.ATG" +#line 1165 "cs.ATG" name = "int"; break; } case 115: { lexer.NextToken(); -#line 1157 "cs.ATG" +#line 1166 "cs.ATG" name = "uint"; break; } case 86: { lexer.NextToken(); -#line 1158 "cs.ATG" +#line 1167 "cs.ATG" name = "long"; break; } case 116: { lexer.NextToken(); -#line 1159 "cs.ATG" +#line 1168 "cs.ATG" name = "ulong"; break; } case 56: { lexer.NextToken(); -#line 1160 "cs.ATG" +#line 1169 "cs.ATG" name = "char"; break; } @@ -1618,25 +1630,25 @@ out string name) { void EnumBody() { -#line 1001 "cs.ATG" +#line 1008 "cs.ATG" FieldDeclaration f; Expect(16); if (la.kind == 1 || la.kind == 18) { EnumMemberDecl( -#line 1003 "cs.ATG" +#line 1011 "cs.ATG" out f); -#line 1003 "cs.ATG" +#line 1011 "cs.ATG" compilationUnit.AddChild(f); while ( -#line 1004 "cs.ATG" +#line 1012 "cs.ATG" NotFinalComma()) { Expect(14); EnumMemberDecl( -#line 1004 "cs.ATG" +#line 1013 "cs.ATG" out f); -#line 1004 "cs.ATG" +#line 1013 "cs.ATG" compilationUnit.AddChild(f); } if (la.kind == 14) { @@ -1647,36 +1659,36 @@ out f); } void Type( -#line 1009 "cs.ATG" +#line 1018 "cs.ATG" out TypeReference type) { TypeWithRestriction( -#line 1011 "cs.ATG" +#line 1020 "cs.ATG" out type, true, false); } void FormalParameterList( -#line 1072 "cs.ATG" +#line 1081 "cs.ATG" List parameter) { -#line 1075 "cs.ATG" +#line 1084 "cs.ATG" ParameterDeclarationExpression p; AttributeSection section; List attributes = new List(); while (la.kind == 18) { AttributeSection( -#line 1080 "cs.ATG" +#line 1089 "cs.ATG" out section); -#line 1080 "cs.ATG" +#line 1089 "cs.ATG" attributes.Add(section); } if (StartOf(14)) { FixedParameter( -#line 1082 "cs.ATG" +#line 1091 "cs.ATG" out p); -#line 1082 "cs.ATG" +#line 1091 "cs.ATG" bool paramsFound = false; p.Attributes = attributes; parameter.Add(p); @@ -1684,96 +1696,96 @@ out p); while (la.kind == 14) { lexer.NextToken(); -#line 1087 "cs.ATG" +#line 1096 "cs.ATG" attributes = new List(); if (paramsFound) Error("params array must be at end of parameter list"); while (la.kind == 18) { AttributeSection( -#line 1088 "cs.ATG" +#line 1097 "cs.ATG" out section); -#line 1088 "cs.ATG" +#line 1097 "cs.ATG" attributes.Add(section); } if (StartOf(14)) { FixedParameter( -#line 1090 "cs.ATG" +#line 1099 "cs.ATG" out p); -#line 1090 "cs.ATG" +#line 1099 "cs.ATG" p.Attributes = attributes; parameter.Add(p); } else if (la.kind == 94) { ParameterArray( -#line 1091 "cs.ATG" +#line 1100 "cs.ATG" out p); -#line 1091 "cs.ATG" +#line 1100 "cs.ATG" paramsFound = true; p.Attributes = attributes; parameter.Add(p); } else SynErr(134); } } else if (la.kind == 94) { ParameterArray( -#line 1094 "cs.ATG" +#line 1103 "cs.ATG" out p); -#line 1094 "cs.ATG" +#line 1103 "cs.ATG" p.Attributes = attributes; parameter.Add(p); } else SynErr(135); } void ClassType( -#line 1142 "cs.ATG" +#line 1151 "cs.ATG" out TypeReference typeRef, bool canBeUnbound) { -#line 1143 "cs.ATG" +#line 1152 "cs.ATG" TypeReference r; typeRef = null; if (la.kind == 1) { TypeName( -#line 1145 "cs.ATG" +#line 1154 "cs.ATG" out r, canBeUnbound); -#line 1145 "cs.ATG" +#line 1154 "cs.ATG" typeRef = r; } else if (la.kind == 90) { lexer.NextToken(); -#line 1146 "cs.ATG" +#line 1155 "cs.ATG" typeRef = new TypeReference("object"); } else if (la.kind == 107) { lexer.NextToken(); -#line 1147 "cs.ATG" +#line 1156 "cs.ATG" typeRef = new TypeReference("string"); } else SynErr(136); } void TypeName( -#line 2423 "cs.ATG" +#line 2432 "cs.ATG" out TypeReference typeRef, bool canBeUnbound) { -#line 2424 "cs.ATG" +#line 2433 "cs.ATG" List typeArguments = null; string alias = null; string qualident; if ( -#line 2429 "cs.ATG" +#line 2438 "cs.ATG" la.kind == Tokens.Identifier && Peek(1).kind == Tokens.DoubleColon) { lexer.NextToken(); -#line 2430 "cs.ATG" +#line 2439 "cs.ATG" alias = t.val; Expect(10); } Qualident( -#line 2433 "cs.ATG" +#line 2442 "cs.ATG" out qualident); if (la.kind == 23) { TypeArgumentList( -#line 2434 "cs.ATG" +#line 2443 "cs.ATG" out typeArguments, canBeUnbound); } -#line 2436 "cs.ATG" +#line 2445 "cs.ATG" if (alias == null) { typeRef = new TypeReference(qualident, typeArguments); } else if (alias == "global") { @@ -1784,129 +1796,129 @@ out typeArguments, canBeUnbound); } while ( -#line 2445 "cs.ATG" +#line 2454 "cs.ATG" DotAndIdent()) { Expect(15); -#line 2446 "cs.ATG" +#line 2455 "cs.ATG" typeArguments = null; Qualident( -#line 2447 "cs.ATG" +#line 2456 "cs.ATG" out qualident); if (la.kind == 23) { TypeArgumentList( -#line 2448 "cs.ATG" +#line 2457 "cs.ATG" out typeArguments, canBeUnbound); } -#line 2449 "cs.ATG" +#line 2458 "cs.ATG" typeRef = new InnerClassTypeReference(typeRef, qualident, typeArguments); } } void MemberModifiers( -#line 1163 "cs.ATG" +#line 1172 "cs.ATG" Modifiers m) { while (StartOf(15) || -#line 1180 "cs.ATG" +#line 1189 "cs.ATG" la.kind == Tokens.Identifier && la.val == "partial") { if (la.kind == 48) { lexer.NextToken(); -#line 1166 "cs.ATG" +#line 1175 "cs.ATG" m.Add(Modifier.Abstract, t.Location); } else if (la.kind == 70) { lexer.NextToken(); -#line 1167 "cs.ATG" +#line 1176 "cs.ATG" m.Add(Modifier.Extern, t.Location); } else if (la.kind == 83) { lexer.NextToken(); -#line 1168 "cs.ATG" +#line 1177 "cs.ATG" m.Add(Modifier.Internal, t.Location); } else if (la.kind == 88) { lexer.NextToken(); -#line 1169 "cs.ATG" +#line 1178 "cs.ATG" m.Add(Modifier.New, t.Location); } else if (la.kind == 93) { lexer.NextToken(); -#line 1170 "cs.ATG" +#line 1179 "cs.ATG" m.Add(Modifier.Override, t.Location); } else if (la.kind == 95) { lexer.NextToken(); -#line 1171 "cs.ATG" +#line 1180 "cs.ATG" m.Add(Modifier.Private, t.Location); } else if (la.kind == 96) { lexer.NextToken(); -#line 1172 "cs.ATG" +#line 1181 "cs.ATG" m.Add(Modifier.Protected, t.Location); } else if (la.kind == 97) { lexer.NextToken(); -#line 1173 "cs.ATG" +#line 1182 "cs.ATG" m.Add(Modifier.Public, t.Location); } else if (la.kind == 98) { lexer.NextToken(); -#line 1174 "cs.ATG" +#line 1183 "cs.ATG" m.Add(Modifier.ReadOnly, t.Location); } else if (la.kind == 102) { lexer.NextToken(); -#line 1175 "cs.ATG" +#line 1184 "cs.ATG" m.Add(Modifier.Sealed, t.Location); } else if (la.kind == 106) { lexer.NextToken(); -#line 1176 "cs.ATG" +#line 1185 "cs.ATG" m.Add(Modifier.Static, t.Location); } else if (la.kind == 118) { lexer.NextToken(); -#line 1177 "cs.ATG" +#line 1186 "cs.ATG" m.Add(Modifier.Unsafe, t.Location); } else if (la.kind == 121) { lexer.NextToken(); -#line 1178 "cs.ATG" +#line 1187 "cs.ATG" m.Add(Modifier.Virtual, t.Location); } else if (la.kind == 123) { lexer.NextToken(); -#line 1179 "cs.ATG" +#line 1188 "cs.ATG" m.Add(Modifier.Volatile, t.Location); } else { Expect(1); -#line 1181 "cs.ATG" +#line 1190 "cs.ATG" m.Add(Modifier.Partial, t.Location); } } } void ClassMemberDecl( -#line 1456 "cs.ATG" +#line 1465 "cs.ATG" Modifiers m, List attributes) { -#line 1457 "cs.ATG" +#line 1466 "cs.ATG" Statement stmt = null; if (StartOf(16)) { StructMemberDecl( -#line 1459 "cs.ATG" +#line 1468 "cs.ATG" m, attributes); } else if (la.kind == 27) { -#line 1460 "cs.ATG" +#line 1469 "cs.ATG" m.Check(Modifier.Destructors); Point startPos = t.Location; lexer.NextToken(); Expect(1); -#line 1461 "cs.ATG" +#line 1470 "cs.ATG" DestructorDeclaration d = new DestructorDeclaration(t.val, m.Modifier, attributes); d.Modifier = m.Modifier; d.StartLocation = m.GetDeclarationLocation(startPos); @@ -1914,17 +1926,17 @@ m, attributes); Expect(20); Expect(21); -#line 1465 "cs.ATG" +#line 1474 "cs.ATG" d.EndLocation = t.EndLocation; if (la.kind == 16) { Block( -#line 1465 "cs.ATG" +#line 1474 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(137); -#line 1466 "cs.ATG" +#line 1475 "cs.ATG" d.Body = (BlockStatement)stmt; compilationUnit.AddChild(d); @@ -1932,10 +1944,10 @@ out stmt); } void StructMemberDecl( -#line 1186 "cs.ATG" +#line 1195 "cs.ATG" Modifiers m, List attributes) { -#line 1188 "cs.ATG" +#line 1197 "cs.ATG" string qualident = null; TypeReference type; Expression expr; @@ -1947,18 +1959,18 @@ Modifiers m, List attributes) { if (la.kind == 59) { -#line 1198 "cs.ATG" +#line 1207 "cs.ATG" m.Check(Modifier.Constants); lexer.NextToken(); -#line 1199 "cs.ATG" +#line 1208 "cs.ATG" Point startPos = t.Location; Type( -#line 1200 "cs.ATG" +#line 1209 "cs.ATG" out type); Expect(1); -#line 1200 "cs.ATG" +#line 1209 "cs.ATG" FieldDeclaration fd = new FieldDeclaration(attributes, type, m.Modifier | Modifier.Const); fd.StartLocation = m.GetDeclarationLocation(startPos); VariableDeclaration f = new VariableDeclaration(t.val); @@ -1966,72 +1978,72 @@ out type); Expect(3); Expr( -#line 1205 "cs.ATG" +#line 1214 "cs.ATG" out expr); -#line 1205 "cs.ATG" +#line 1214 "cs.ATG" f.Initializer = expr; while (la.kind == 14) { lexer.NextToken(); Expect(1); -#line 1206 "cs.ATG" +#line 1215 "cs.ATG" f = new VariableDeclaration(t.val); fd.Fields.Add(f); Expect(3); Expr( -#line 1209 "cs.ATG" +#line 1218 "cs.ATG" out expr); -#line 1209 "cs.ATG" +#line 1218 "cs.ATG" f.Initializer = expr; } Expect(11); -#line 1210 "cs.ATG" +#line 1219 "cs.ATG" fd.EndLocation = t.EndLocation; compilationUnit.AddChild(fd); } else if ( -#line 1214 "cs.ATG" +#line 1223 "cs.ATG" NotVoidPointer()) { -#line 1214 "cs.ATG" +#line 1223 "cs.ATG" m.Check(Modifier.PropertysEventsMethods); Expect(122); -#line 1215 "cs.ATG" +#line 1224 "cs.ATG" Point startPos = t.Location; if ( -#line 1216 "cs.ATG" +#line 1225 "cs.ATG" IsExplicitInterfaceImplementation()) { TypeName( -#line 1217 "cs.ATG" +#line 1226 "cs.ATG" out explicitInterface, false); -#line 1218 "cs.ATG" +#line 1227 "cs.ATG" if (la.kind != Tokens.Dot || Peek(1).kind != Tokens.This) { qualident = TypeReference.StripLastIdentifierFromType(ref explicitInterface); } } else if (la.kind == 1) { lexer.NextToken(); -#line 1221 "cs.ATG" +#line 1230 "cs.ATG" qualident = t.val; } else SynErr(139); if (la.kind == 23) { TypeParameterList( -#line 1224 "cs.ATG" +#line 1233 "cs.ATG" templates); } Expect(20); if (StartOf(10)) { FormalParameterList( -#line 1227 "cs.ATG" +#line 1236 "cs.ATG" p); } Expect(21); -#line 1228 "cs.ATG" +#line 1237 "cs.ATG" MethodDeclaration methodDeclaration = new MethodDeclaration(qualident, m.Modifier, new TypeReference("void"), @@ -2046,31 +2058,31 @@ p); compilationUnit.BlockStart(methodDeclaration); while ( -#line 1243 "cs.ATG" +#line 1252 "cs.ATG" IdentIsWhere()) { TypeParameterConstraintsClause( -#line 1243 "cs.ATG" +#line 1252 "cs.ATG" templates); } if (la.kind == 16) { Block( -#line 1245 "cs.ATG" +#line 1254 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(140); -#line 1245 "cs.ATG" +#line 1254 "cs.ATG" compilationUnit.BlockEnd(); methodDeclaration.Body = (BlockStatement)stmt; } else if (la.kind == 68) { -#line 1249 "cs.ATG" +#line 1258 "cs.ATG" m.Check(Modifier.PropertysEventsMethods); lexer.NextToken(); -#line 1250 "cs.ATG" +#line 1259 "cs.ATG" EventDeclaration eventDecl = new EventDeclaration(null, null, m.Modifier, attributes, null); eventDecl.StartLocation = t.Location; compilationUnit.AddChild(eventDecl); @@ -2079,104 +2091,104 @@ out stmt); EventRemoveRegion removeBlock = null; Type( -#line 1257 "cs.ATG" +#line 1266 "cs.ATG" out type); -#line 1257 "cs.ATG" +#line 1266 "cs.ATG" eventDecl.TypeReference = type; if ( -#line 1258 "cs.ATG" +#line 1267 "cs.ATG" IsExplicitInterfaceImplementation()) { TypeName( -#line 1259 "cs.ATG" +#line 1268 "cs.ATG" out explicitInterface, false); -#line 1260 "cs.ATG" +#line 1269 "cs.ATG" qualident = TypeReference.StripLastIdentifierFromType(ref explicitInterface); -#line 1261 "cs.ATG" +#line 1270 "cs.ATG" eventDecl.InterfaceImplementations.Add(new InterfaceImplementation(explicitInterface, qualident)); } else if (la.kind == 1) { lexer.NextToken(); -#line 1263 "cs.ATG" +#line 1272 "cs.ATG" qualident = t.val; } else SynErr(141); -#line 1265 "cs.ATG" +#line 1274 "cs.ATG" eventDecl.Name = qualident; eventDecl.EndLocation = t.EndLocation; if (la.kind == 16) { lexer.NextToken(); -#line 1266 "cs.ATG" +#line 1275 "cs.ATG" eventDecl.BodyStart = t.Location; EventAccessorDecls( -#line 1267 "cs.ATG" +#line 1276 "cs.ATG" out addBlock, out removeBlock); Expect(17); -#line 1268 "cs.ATG" +#line 1277 "cs.ATG" eventDecl.BodyEnd = t.EndLocation; } if (la.kind == 11) { lexer.NextToken(); } -#line 1271 "cs.ATG" +#line 1280 "cs.ATG" compilationUnit.BlockEnd(); eventDecl.AddRegion = addBlock; eventDecl.RemoveRegion = removeBlock; } else if ( -#line 1277 "cs.ATG" +#line 1286 "cs.ATG" IdentAndLPar()) { -#line 1277 "cs.ATG" +#line 1286 "cs.ATG" m.Check(Modifier.Constructors | Modifier.StaticConstructors); Expect(1); -#line 1278 "cs.ATG" +#line 1287 "cs.ATG" string name = t.val; Point startPos = t.Location; Expect(20); if (StartOf(10)) { -#line 1278 "cs.ATG" +#line 1287 "cs.ATG" m.Check(Modifier.Constructors); FormalParameterList( -#line 1279 "cs.ATG" +#line 1288 "cs.ATG" p); } Expect(21); -#line 1281 "cs.ATG" +#line 1290 "cs.ATG" ConstructorInitializer init = null; if (la.kind == 9) { -#line 1282 "cs.ATG" +#line 1291 "cs.ATG" m.Check(Modifier.Constructors); ConstructorInitializer( -#line 1283 "cs.ATG" +#line 1292 "cs.ATG" out init); } -#line 1285 "cs.ATG" +#line 1294 "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 1290 "cs.ATG" +#line 1299 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(142); -#line 1290 "cs.ATG" +#line 1299 "cs.ATG" cd.Body = (BlockStatement)stmt; compilationUnit.AddChild(cd); } else if (la.kind == 69 || la.kind == 79) { -#line 1293 "cs.ATG" +#line 1302 "cs.ATG" m.Check(Modifier.Operators); if (m.isNone) Error("at least one modifier must be set"); bool isImplicit = true; @@ -2185,45 +2197,45 @@ out stmt); if (la.kind == 79) { lexer.NextToken(); -#line 1298 "cs.ATG" +#line 1307 "cs.ATG" startPos = t.Location; } else { lexer.NextToken(); -#line 1298 "cs.ATG" +#line 1307 "cs.ATG" isImplicit = false; startPos = t.Location; } Expect(91); Type( -#line 1299 "cs.ATG" +#line 1308 "cs.ATG" out type); -#line 1299 "cs.ATG" +#line 1308 "cs.ATG" TypeReference operatorType = type; Expect(20); Type( -#line 1300 "cs.ATG" +#line 1309 "cs.ATG" out type); Expect(1); -#line 1300 "cs.ATG" +#line 1309 "cs.ATG" string varName = t.val; Expect(21); -#line 1301 "cs.ATG" +#line 1310 "cs.ATG" Point endPos = t.Location; if (la.kind == 16) { Block( -#line 1302 "cs.ATG" +#line 1311 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); -#line 1302 "cs.ATG" +#line 1311 "cs.ATG" stmt = null; } else SynErr(143); -#line 1305 "cs.ATG" +#line 1314 "cs.ATG" List parameters = new List(); parameters.Add(new ParameterDeclarationExpression(type, varName)); OperatorDeclaration operatorDeclaration = new OperatorDeclaration(m.Modifier, @@ -2239,61 +2251,61 @@ out stmt); } else if (StartOf(17)) { TypeDecl( -#line 1321 "cs.ATG" +#line 1330 "cs.ATG" m, attributes); } else if (StartOf(9)) { Type( -#line 1323 "cs.ATG" +#line 1332 "cs.ATG" out type); -#line 1323 "cs.ATG" +#line 1332 "cs.ATG" Point startPos = t.Location; if (la.kind == 91) { -#line 1325 "cs.ATG" +#line 1334 "cs.ATG" OverloadableOperatorType op; m.Check(Modifier.Operators); if (m.isNone) Error("at least one modifier must be set"); lexer.NextToken(); OverloadableOperator( -#line 1329 "cs.ATG" +#line 1338 "cs.ATG" out op); -#line 1329 "cs.ATG" +#line 1338 "cs.ATG" TypeReference firstType, secondType = null; string secondName = null; Expect(20); Type( -#line 1330 "cs.ATG" +#line 1339 "cs.ATG" out firstType); Expect(1); -#line 1330 "cs.ATG" +#line 1339 "cs.ATG" string firstName = t.val; if (la.kind == 14) { lexer.NextToken(); Type( -#line 1331 "cs.ATG" +#line 1340 "cs.ATG" out secondType); Expect(1); -#line 1331 "cs.ATG" +#line 1340 "cs.ATG" secondName = t.val; } else if (la.kind == 21) { } else SynErr(144); -#line 1339 "cs.ATG" +#line 1348 "cs.ATG" Point endPos = t.Location; Expect(21); if (la.kind == 16) { Block( -#line 1340 "cs.ATG" +#line 1349 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(145); -#line 1342 "cs.ATG" +#line 1351 "cs.ATG" List parameters = new List(); parameters.Add(new ParameterDeclarationExpression(firstType, firstName)); if (secondType != null) { @@ -2310,43 +2322,43 @@ out stmt); compilationUnit.AddChild(operatorDeclaration); } else if ( -#line 1359 "cs.ATG" +#line 1368 "cs.ATG" IsVarDecl()) { -#line 1359 "cs.ATG" +#line 1368 "cs.ATG" m.Check(Modifier.Fields); FieldDeclaration fd = new FieldDeclaration(attributes, type, m.Modifier); fd.StartLocation = m.GetDeclarationLocation(startPos); VariableDeclarator( -#line 1363 "cs.ATG" +#line 1372 "cs.ATG" variableDeclarators); while (la.kind == 14) { lexer.NextToken(); VariableDeclarator( -#line 1364 "cs.ATG" +#line 1373 "cs.ATG" variableDeclarators); } Expect(11); -#line 1365 "cs.ATG" +#line 1374 "cs.ATG" fd.EndLocation = t.EndLocation; fd.Fields = variableDeclarators; compilationUnit.AddChild(fd); } else if (la.kind == 110) { -#line 1368 "cs.ATG" +#line 1377 "cs.ATG" m.Check(Modifier.Indexers); lexer.NextToken(); Expect(18); FormalParameterList( -#line 1369 "cs.ATG" +#line 1378 "cs.ATG" p); Expect(19); -#line 1369 "cs.ATG" +#line 1378 "cs.ATG" Point endLocation = t.EndLocation; Expect(16); -#line 1370 "cs.ATG" +#line 1379 "cs.ATG" IndexerDeclaration indexer = new IndexerDeclaration(type, p, m.Modifier, attributes); indexer.StartLocation = startPos; indexer.EndLocation = endLocation; @@ -2355,58 +2367,58 @@ p); PropertySetRegion setRegion; AccessorDecls( -#line 1377 "cs.ATG" +#line 1386 "cs.ATG" out getRegion, out setRegion); Expect(17); -#line 1378 "cs.ATG" +#line 1387 "cs.ATG" indexer.BodyEnd = t.EndLocation; indexer.GetRegion = getRegion; indexer.SetRegion = setRegion; compilationUnit.AddChild(indexer); } else if ( -#line 1383 "cs.ATG" +#line 1392 "cs.ATG" la.kind == Tokens.Identifier) { if ( -#line 1384 "cs.ATG" +#line 1393 "cs.ATG" IsExplicitInterfaceImplementation()) { TypeName( -#line 1385 "cs.ATG" +#line 1394 "cs.ATG" out explicitInterface, false); -#line 1386 "cs.ATG" +#line 1395 "cs.ATG" if (la.kind != Tokens.Dot || Peek(1).kind != Tokens.This) { qualident = TypeReference.StripLastIdentifierFromType(ref explicitInterface); } } else if (la.kind == 1) { lexer.NextToken(); -#line 1389 "cs.ATG" +#line 1398 "cs.ATG" qualident = t.val; } else SynErr(146); -#line 1391 "cs.ATG" +#line 1400 "cs.ATG" Point qualIdentEndLocation = t.EndLocation; if (la.kind == 16 || la.kind == 20 || la.kind == 23) { if (la.kind == 20 || la.kind == 23) { -#line 1395 "cs.ATG" +#line 1404 "cs.ATG" m.Check(Modifier.PropertysEventsMethods); if (la.kind == 23) { TypeParameterList( -#line 1397 "cs.ATG" +#line 1406 "cs.ATG" templates); } Expect(20); if (StartOf(10)) { FormalParameterList( -#line 1398 "cs.ATG" +#line 1407 "cs.ATG" p); } Expect(21); -#line 1399 "cs.ATG" +#line 1408 "cs.ATG" MethodDeclaration methodDeclaration = new MethodDeclaration(qualident, m.Modifier, type, @@ -2420,26 +2432,26 @@ p); compilationUnit.AddChild(methodDeclaration); while ( -#line 1411 "cs.ATG" +#line 1420 "cs.ATG" IdentIsWhere()) { TypeParameterConstraintsClause( -#line 1411 "cs.ATG" +#line 1420 "cs.ATG" templates); } if (la.kind == 16) { Block( -#line 1412 "cs.ATG" +#line 1421 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(147); -#line 1412 "cs.ATG" +#line 1421 "cs.ATG" methodDeclaration.Body = (BlockStatement)stmt; } else { lexer.NextToken(); -#line 1415 "cs.ATG" +#line 1424 "cs.ATG" PropertyDeclaration pDecl = new PropertyDeclaration(qualident, type, m.Modifier, attributes); if (explicitInterface != null) pDecl.InterfaceImplementations.Add(new InterfaceImplementation(explicitInterface, qualident)); @@ -2450,11 +2462,11 @@ out stmt); PropertySetRegion setRegion; AccessorDecls( -#line 1424 "cs.ATG" +#line 1433 "cs.ATG" out getRegion, out setRegion); Expect(17); -#line 1426 "cs.ATG" +#line 1435 "cs.ATG" pDecl.GetRegion = getRegion; pDecl.SetRegion = setRegion; pDecl.BodyEnd = t.EndLocation; @@ -2463,17 +2475,17 @@ out getRegion, out setRegion); } } else if (la.kind == 15) { -#line 1434 "cs.ATG" +#line 1443 "cs.ATG" m.Check(Modifier.Indexers); lexer.NextToken(); Expect(110); Expect(18); FormalParameterList( -#line 1435 "cs.ATG" +#line 1444 "cs.ATG" p); Expect(19); -#line 1436 "cs.ATG" +#line 1445 "cs.ATG" IndexerDeclaration indexer = new IndexerDeclaration(type, p, m.Modifier, attributes); indexer.StartLocation = m.GetDeclarationLocation(startPos); indexer.EndLocation = t.EndLocation; @@ -2484,14 +2496,14 @@ p); Expect(16); -#line 1444 "cs.ATG" +#line 1453 "cs.ATG" Point bodyStart = t.Location; AccessorDecls( -#line 1445 "cs.ATG" +#line 1454 "cs.ATG" out getRegion, out setRegion); Expect(17); -#line 1446 "cs.ATG" +#line 1455 "cs.ATG" indexer.BodyStart = bodyStart; indexer.BodyEnd = t.EndLocation; indexer.GetRegion = getRegion; @@ -2505,7 +2517,7 @@ out getRegion, out setRegion); void InterfaceMemberDecl() { -#line 1473 "cs.ATG" +#line 1482 "cs.ATG" TypeReference type; AttributeSection section; @@ -2520,51 +2532,51 @@ out getRegion, out setRegion); while (la.kind == 18) { AttributeSection( -#line 1486 "cs.ATG" +#line 1495 "cs.ATG" out section); -#line 1486 "cs.ATG" +#line 1495 "cs.ATG" attributes.Add(section); } if (la.kind == 88) { lexer.NextToken(); -#line 1487 "cs.ATG" +#line 1496 "cs.ATG" mod = Modifier.New; startLocation = t.Location; } if ( -#line 1490 "cs.ATG" +#line 1499 "cs.ATG" NotVoidPointer()) { Expect(122); -#line 1490 "cs.ATG" +#line 1499 "cs.ATG" if (startLocation.X == -1) startLocation = t.Location; Expect(1); -#line 1490 "cs.ATG" +#line 1499 "cs.ATG" name = t.val; if (la.kind == 23) { TypeParameterList( -#line 1491 "cs.ATG" +#line 1500 "cs.ATG" templates); } Expect(20); if (StartOf(10)) { FormalParameterList( -#line 1492 "cs.ATG" +#line 1501 "cs.ATG" parameters); } Expect(21); while ( -#line 1493 "cs.ATG" +#line 1502 "cs.ATG" IdentIsWhere()) { TypeParameterConstraintsClause( -#line 1493 "cs.ATG" +#line 1502 "cs.ATG" templates); } Expect(11); -#line 1495 "cs.ATG" +#line 1504 "cs.ATG" MethodDeclaration md = new MethodDeclaration(name, mod, new TypeReference("void"), parameters, attributes); md.StartLocation = startLocation; md.EndLocation = t.EndLocation; @@ -2574,39 +2586,39 @@ templates); } else if (StartOf(18)) { if (StartOf(9)) { Type( -#line 1502 "cs.ATG" +#line 1511 "cs.ATG" out type); -#line 1502 "cs.ATG" +#line 1511 "cs.ATG" if (startLocation.X == -1) startLocation = t.Location; if (la.kind == 1) { lexer.NextToken(); -#line 1504 "cs.ATG" +#line 1513 "cs.ATG" name = t.val; Point qualIdentEndLocation = t.EndLocation; if (la.kind == 20 || la.kind == 23) { if (la.kind == 23) { TypeParameterList( -#line 1508 "cs.ATG" +#line 1517 "cs.ATG" templates); } Expect(20); if (StartOf(10)) { FormalParameterList( -#line 1509 "cs.ATG" +#line 1518 "cs.ATG" parameters); } Expect(21); while ( -#line 1511 "cs.ATG" +#line 1520 "cs.ATG" IdentIsWhere()) { TypeParameterConstraintsClause( -#line 1511 "cs.ATG" +#line 1520 "cs.ATG" templates); } Expect(11); -#line 1512 "cs.ATG" +#line 1521 "cs.ATG" MethodDeclaration md = new MethodDeclaration(name, mod, type, parameters, attributes); md.StartLocation = startLocation; md.EndLocation = t.EndLocation; @@ -2615,72 +2627,72 @@ templates); } else if (la.kind == 16) { -#line 1519 "cs.ATG" +#line 1528 "cs.ATG" PropertyDeclaration pd = new PropertyDeclaration(name, type, mod, attributes); compilationUnit.AddChild(pd); lexer.NextToken(); -#line 1520 "cs.ATG" +#line 1529 "cs.ATG" Point bodyStart = t.Location; InterfaceAccessors( -#line 1520 "cs.ATG" +#line 1529 "cs.ATG" out getBlock, out setBlock); Expect(17); -#line 1520 "cs.ATG" +#line 1529 "cs.ATG" pd.GetRegion = getBlock; pd.SetRegion = setBlock; pd.StartLocation = startLocation; pd.EndLocation = qualIdentEndLocation; pd.BodyStart = bodyStart; pd.BodyEnd = t.EndLocation; } else SynErr(151); } else if (la.kind == 110) { lexer.NextToken(); Expect(18); FormalParameterList( -#line 1523 "cs.ATG" +#line 1532 "cs.ATG" parameters); Expect(19); -#line 1523 "cs.ATG" +#line 1532 "cs.ATG" Point bracketEndLocation = t.EndLocation; -#line 1523 "cs.ATG" +#line 1532 "cs.ATG" IndexerDeclaration id = new IndexerDeclaration(type, parameters, mod, attributes); compilationUnit.AddChild(id); Expect(16); -#line 1524 "cs.ATG" +#line 1533 "cs.ATG" Point bodyStart = t.Location; InterfaceAccessors( -#line 1524 "cs.ATG" +#line 1533 "cs.ATG" out getBlock, out setBlock); Expect(17); -#line 1524 "cs.ATG" +#line 1533 "cs.ATG" id.GetRegion = getBlock; id.SetRegion = setBlock; id.StartLocation = startLocation; id.EndLocation = bracketEndLocation; id.BodyStart = bodyStart; id.BodyEnd = t.EndLocation; } else SynErr(152); } else { lexer.NextToken(); -#line 1527 "cs.ATG" +#line 1536 "cs.ATG" if (startLocation.X == -1) startLocation = t.Location; Type( -#line 1527 "cs.ATG" +#line 1536 "cs.ATG" out type); Expect(1); -#line 1527 "cs.ATG" +#line 1536 "cs.ATG" EventDeclaration ed = new EventDeclaration(type, t.val, mod, attributes, null); compilationUnit.AddChild(ed); Expect(11); -#line 1530 "cs.ATG" +#line 1539 "cs.ATG" ed.StartLocation = startLocation; ed.EndLocation = t.EndLocation; } } else SynErr(153); } void EnumMemberDecl( -#line 1535 "cs.ATG" +#line 1544 "cs.ATG" out FieldDeclaration f) { -#line 1537 "cs.ATG" +#line 1546 "cs.ATG" Expression expr = null; List attributes = new List(); AttributeSection section = null; @@ -2688,15 +2700,15 @@ out FieldDeclaration f) { while (la.kind == 18) { AttributeSection( -#line 1543 "cs.ATG" +#line 1552 "cs.ATG" out section); -#line 1543 "cs.ATG" +#line 1552 "cs.ATG" attributes.Add(section); } Expect(1); -#line 1544 "cs.ATG" +#line 1553 "cs.ATG" f = new FieldDeclaration(attributes); varDecl = new VariableDeclaration(t.val); f.Fields.Add(varDecl); @@ -2705,78 +2717,78 @@ out section); if (la.kind == 3) { lexer.NextToken(); Expr( -#line 1549 "cs.ATG" +#line 1558 "cs.ATG" out expr); -#line 1549 "cs.ATG" +#line 1558 "cs.ATG" varDecl.Initializer = expr; } } void TypeWithRestriction( -#line 1014 "cs.ATG" +#line 1023 "cs.ATG" out TypeReference type, bool allowNullable, bool canBeUnbound) { -#line 1016 "cs.ATG" +#line 1025 "cs.ATG" string name; int pointer = 0; type = null; if (la.kind == 1 || la.kind == 90 || la.kind == 107) { ClassType( -#line 1021 "cs.ATG" +#line 1030 "cs.ATG" out type, canBeUnbound); } else if (StartOf(4)) { SimpleType( -#line 1022 "cs.ATG" +#line 1031 "cs.ATG" out name); -#line 1022 "cs.ATG" +#line 1031 "cs.ATG" type = new TypeReference(name); } else if (la.kind == 122) { lexer.NextToken(); Expect(6); -#line 1023 "cs.ATG" +#line 1032 "cs.ATG" pointer = 1; type = new TypeReference("void"); } else SynErr(154); -#line 1024 "cs.ATG" +#line 1033 "cs.ATG" List r = new List(); if ( -#line 1026 "cs.ATG" +#line 1035 "cs.ATG" allowNullable && la.kind == Tokens.Question) { NullableQuestionMark( -#line 1026 "cs.ATG" +#line 1035 "cs.ATG" ref type); } while ( -#line 1028 "cs.ATG" +#line 1037 "cs.ATG" IsPointerOrDims()) { -#line 1028 "cs.ATG" +#line 1037 "cs.ATG" int i = 0; if (la.kind == 6) { lexer.NextToken(); -#line 1029 "cs.ATG" +#line 1038 "cs.ATG" ++pointer; } else if (la.kind == 18) { lexer.NextToken(); while (la.kind == 14) { lexer.NextToken(); -#line 1030 "cs.ATG" +#line 1039 "cs.ATG" ++i; } Expect(19); -#line 1030 "cs.ATG" +#line 1039 "cs.ATG" r.Add(i); } else SynErr(155); } -#line 1033 "cs.ATG" +#line 1042 "cs.ATG" if (type != null) { type.RankSpecifier = r.ToArray(); type.PointerNestingLevel = pointer; @@ -2785,57 +2797,57 @@ IsPointerOrDims()) { } void SimpleType( -#line 1061 "cs.ATG" +#line 1070 "cs.ATG" out string name) { -#line 1062 "cs.ATG" +#line 1071 "cs.ATG" name = String.Empty; if (StartOf(19)) { IntegralType( -#line 1064 "cs.ATG" +#line 1073 "cs.ATG" out name); } else if (la.kind == 74) { lexer.NextToken(); -#line 1065 "cs.ATG" +#line 1074 "cs.ATG" name = "float"; } else if (la.kind == 65) { lexer.NextToken(); -#line 1066 "cs.ATG" +#line 1075 "cs.ATG" name = "double"; } else if (la.kind == 61) { lexer.NextToken(); -#line 1067 "cs.ATG" +#line 1076 "cs.ATG" name = "decimal"; } else if (la.kind == 51) { lexer.NextToken(); -#line 1068 "cs.ATG" +#line 1077 "cs.ATG" name = "bool"; } else SynErr(156); } void NullableQuestionMark( -#line 2454 "cs.ATG" +#line 2463 "cs.ATG" ref TypeReference typeRef) { -#line 2455 "cs.ATG" +#line 2464 "cs.ATG" List typeArguments = new List(1); Expect(12); -#line 2459 "cs.ATG" +#line 2468 "cs.ATG" if (typeRef != null) typeArguments.Add(typeRef); typeRef = new TypeReference("System.Nullable", typeArguments); } void FixedParameter( -#line 1098 "cs.ATG" +#line 1107 "cs.ATG" out ParameterDeclarationExpression p) { -#line 1100 "cs.ATG" +#line 1109 "cs.ATG" TypeReference type; ParamModifier mod = ParamModifier.In; System.Drawing.Point start = t.Location; @@ -2844,82 +2856,82 @@ out ParameterDeclarationExpression p) { if (la.kind == 99) { lexer.NextToken(); -#line 1106 "cs.ATG" +#line 1115 "cs.ATG" mod = ParamModifier.Ref; } else { lexer.NextToken(); -#line 1107 "cs.ATG" +#line 1116 "cs.ATG" mod = ParamModifier.Out; } } Type( -#line 1109 "cs.ATG" +#line 1118 "cs.ATG" out type); Expect(1); -#line 1109 "cs.ATG" +#line 1118 "cs.ATG" p = new ParameterDeclarationExpression(type, t.val, mod); p.StartLocation = start; p.EndLocation = t.Location; } void ParameterArray( -#line 1112 "cs.ATG" +#line 1121 "cs.ATG" out ParameterDeclarationExpression p) { -#line 1113 "cs.ATG" +#line 1122 "cs.ATG" TypeReference type; Expect(94); Type( -#line 1115 "cs.ATG" +#line 1124 "cs.ATG" out type); Expect(1); -#line 1115 "cs.ATG" +#line 1124 "cs.ATG" p = new ParameterDeclarationExpression(type, t.val, ParamModifier.Params); } void AccessorModifiers( -#line 1118 "cs.ATG" +#line 1127 "cs.ATG" out Modifiers m) { -#line 1119 "cs.ATG" +#line 1128 "cs.ATG" m = new Modifiers(); if (la.kind == 95) { lexer.NextToken(); -#line 1121 "cs.ATG" +#line 1130 "cs.ATG" m.Add(Modifier.Private, t.Location); } else if (la.kind == 96) { lexer.NextToken(); -#line 1122 "cs.ATG" +#line 1131 "cs.ATG" m.Add(Modifier.Protected, t.Location); if (la.kind == 83) { lexer.NextToken(); -#line 1123 "cs.ATG" +#line 1132 "cs.ATG" m.Add(Modifier.Internal, t.Location); } } else if (la.kind == 83) { lexer.NextToken(); -#line 1124 "cs.ATG" +#line 1133 "cs.ATG" m.Add(Modifier.Internal, t.Location); if (la.kind == 96) { lexer.NextToken(); -#line 1125 "cs.ATG" +#line 1134 "cs.ATG" m.Add(Modifier.Protected, t.Location); } } else SynErr(157); } void Block( -#line 1674 "cs.ATG" +#line 1683 "cs.ATG" out Statement stmt) { Expect(16); -#line 1676 "cs.ATG" +#line 1685 "cs.ATG" BlockStatement blockStmt = new BlockStatement(); blockStmt.StartLocation = t.EndLocation; compilationUnit.BlockStart(blockStmt); @@ -2930,7 +2942,7 @@ out Statement stmt) { } Expect(17); -#line 1683 "cs.ATG" +#line 1692 "cs.ATG" stmt = blockStmt; blockStmt.EndLocation = t.EndLocation; compilationUnit.BlockEnd(); @@ -2938,10 +2950,10 @@ out Statement stmt) { } void EventAccessorDecls( -#line 1609 "cs.ATG" +#line 1618 "cs.ATG" out EventAddRegion addBlock, out EventRemoveRegion removeBlock) { -#line 1610 "cs.ATG" +#line 1619 "cs.ATG" AttributeSection section; List attributes = new List(); Statement stmt; @@ -2950,102 +2962,102 @@ out EventAddRegion addBlock, out EventRemoveRegion removeBlock) { while (la.kind == 18) { AttributeSection( -#line 1617 "cs.ATG" +#line 1626 "cs.ATG" out section); -#line 1617 "cs.ATG" +#line 1626 "cs.ATG" attributes.Add(section); } if ( -#line 1619 "cs.ATG" +#line 1628 "cs.ATG" IdentIsAdd()) { -#line 1619 "cs.ATG" +#line 1628 "cs.ATG" addBlock = new EventAddRegion(attributes); AddAccessorDecl( -#line 1620 "cs.ATG" +#line 1629 "cs.ATG" out stmt); -#line 1620 "cs.ATG" +#line 1629 "cs.ATG" attributes = new List(); addBlock.Block = (BlockStatement)stmt; while (la.kind == 18) { AttributeSection( -#line 1621 "cs.ATG" +#line 1630 "cs.ATG" out section); -#line 1621 "cs.ATG" +#line 1630 "cs.ATG" attributes.Add(section); } RemoveAccessorDecl( -#line 1622 "cs.ATG" +#line 1631 "cs.ATG" out stmt); -#line 1622 "cs.ATG" +#line 1631 "cs.ATG" removeBlock = new EventRemoveRegion(attributes); removeBlock.Block = (BlockStatement)stmt; } else if ( -#line 1623 "cs.ATG" +#line 1632 "cs.ATG" IdentIsRemove()) { RemoveAccessorDecl( -#line 1624 "cs.ATG" +#line 1633 "cs.ATG" out stmt); -#line 1624 "cs.ATG" +#line 1633 "cs.ATG" removeBlock = new EventRemoveRegion(attributes); removeBlock.Block = (BlockStatement)stmt; attributes = new List(); while (la.kind == 18) { AttributeSection( -#line 1625 "cs.ATG" +#line 1634 "cs.ATG" out section); -#line 1625 "cs.ATG" +#line 1634 "cs.ATG" attributes.Add(section); } AddAccessorDecl( -#line 1626 "cs.ATG" +#line 1635 "cs.ATG" out stmt); -#line 1626 "cs.ATG" +#line 1635 "cs.ATG" addBlock = new EventAddRegion(attributes); addBlock.Block = (BlockStatement)stmt; } else if (la.kind == 1) { lexer.NextToken(); -#line 1627 "cs.ATG" +#line 1636 "cs.ATG" Error("add or remove accessor declaration expected"); } else SynErr(158); } void ConstructorInitializer( -#line 1705 "cs.ATG" +#line 1714 "cs.ATG" out ConstructorInitializer ci) { -#line 1706 "cs.ATG" +#line 1715 "cs.ATG" Expression expr; ci = new ConstructorInitializer(); Expect(9); if (la.kind == 50) { lexer.NextToken(); -#line 1710 "cs.ATG" +#line 1719 "cs.ATG" ci.ConstructorInitializerType = ConstructorInitializerType.Base; } else if (la.kind == 110) { lexer.NextToken(); -#line 1711 "cs.ATG" +#line 1720 "cs.ATG" ci.ConstructorInitializerType = ConstructorInitializerType.This; } else SynErr(159); Expect(20); if (StartOf(21)) { Argument( -#line 1714 "cs.ATG" +#line 1723 "cs.ATG" out expr); -#line 1714 "cs.ATG" +#line 1723 "cs.ATG" if (expr != null) { ci.Arguments.Add(expr); } while (la.kind == 14) { lexer.NextToken(); Argument( -#line 1714 "cs.ATG" +#line 1723 "cs.ATG" out expr); -#line 1714 "cs.ATG" +#line 1723 "cs.ATG" if (expr != null) { ci.Arguments.Add(expr); } } } @@ -3053,161 +3065,161 @@ out expr); } void OverloadableOperator( -#line 1728 "cs.ATG" +#line 1737 "cs.ATG" out OverloadableOperatorType op) { -#line 1729 "cs.ATG" +#line 1738 "cs.ATG" op = OverloadableOperatorType.None; switch (la.kind) { case 4: { lexer.NextToken(); -#line 1731 "cs.ATG" +#line 1740 "cs.ATG" op = OverloadableOperatorType.Add; break; } case 5: { lexer.NextToken(); -#line 1732 "cs.ATG" +#line 1741 "cs.ATG" op = OverloadableOperatorType.Subtract; break; } case 24: { lexer.NextToken(); -#line 1734 "cs.ATG" +#line 1743 "cs.ATG" op = OverloadableOperatorType.Not; break; } case 27: { lexer.NextToken(); -#line 1735 "cs.ATG" +#line 1744 "cs.ATG" op = OverloadableOperatorType.BitNot; break; } case 31: { lexer.NextToken(); -#line 1737 "cs.ATG" +#line 1746 "cs.ATG" op = OverloadableOperatorType.Increment; break; } case 32: { lexer.NextToken(); -#line 1738 "cs.ATG" +#line 1747 "cs.ATG" op = OverloadableOperatorType.Decrement; break; } case 112: { lexer.NextToken(); -#line 1740 "cs.ATG" +#line 1749 "cs.ATG" op = OverloadableOperatorType.True; break; } case 71: { lexer.NextToken(); -#line 1741 "cs.ATG" +#line 1750 "cs.ATG" op = OverloadableOperatorType.False; break; } case 6: { lexer.NextToken(); -#line 1743 "cs.ATG" +#line 1752 "cs.ATG" op = OverloadableOperatorType.Multiply; break; } case 7: { lexer.NextToken(); -#line 1744 "cs.ATG" +#line 1753 "cs.ATG" op = OverloadableOperatorType.Divide; break; } case 8: { lexer.NextToken(); -#line 1745 "cs.ATG" +#line 1754 "cs.ATG" op = OverloadableOperatorType.Modulus; break; } case 28: { lexer.NextToken(); -#line 1747 "cs.ATG" +#line 1756 "cs.ATG" op = OverloadableOperatorType.BitwiseAnd; break; } case 29: { lexer.NextToken(); -#line 1748 "cs.ATG" +#line 1757 "cs.ATG" op = OverloadableOperatorType.BitwiseOr; break; } case 30: { lexer.NextToken(); -#line 1749 "cs.ATG" +#line 1758 "cs.ATG" op = OverloadableOperatorType.ExclusiveOr; break; } case 37: { lexer.NextToken(); -#line 1751 "cs.ATG" +#line 1760 "cs.ATG" op = OverloadableOperatorType.ShiftLeft; break; } case 33: { lexer.NextToken(); -#line 1752 "cs.ATG" +#line 1761 "cs.ATG" op = OverloadableOperatorType.Equality; break; } case 34: { lexer.NextToken(); -#line 1753 "cs.ATG" +#line 1762 "cs.ATG" op = OverloadableOperatorType.InEquality; break; } case 23: { lexer.NextToken(); -#line 1754 "cs.ATG" +#line 1763 "cs.ATG" op = OverloadableOperatorType.LessThan; break; } case 35: { lexer.NextToken(); -#line 1755 "cs.ATG" +#line 1764 "cs.ATG" op = OverloadableOperatorType.GreaterThanOrEqual; break; } case 36: { lexer.NextToken(); -#line 1756 "cs.ATG" +#line 1765 "cs.ATG" op = OverloadableOperatorType.LessThanOrEqual; break; } case 22: { lexer.NextToken(); -#line 1757 "cs.ATG" +#line 1766 "cs.ATG" op = OverloadableOperatorType.GreaterThan; if (la.kind == 22) { lexer.NextToken(); -#line 1757 "cs.ATG" +#line 1766 "cs.ATG" op = OverloadableOperatorType.ShiftRight; } break; @@ -3217,34 +3229,34 @@ out OverloadableOperatorType op) { } void VariableDeclarator( -#line 1667 "cs.ATG" +#line 1676 "cs.ATG" List fieldDeclaration) { -#line 1668 "cs.ATG" +#line 1677 "cs.ATG" Expression expr = null; Expect(1); -#line 1670 "cs.ATG" +#line 1679 "cs.ATG" VariableDeclaration f = new VariableDeclaration(t.val); if (la.kind == 3) { lexer.NextToken(); VariableInitializer( -#line 1671 "cs.ATG" +#line 1680 "cs.ATG" out expr); -#line 1671 "cs.ATG" +#line 1680 "cs.ATG" f.Initializer = expr; } -#line 1671 "cs.ATG" +#line 1680 "cs.ATG" fieldDeclaration.Add(f); } void AccessorDecls( -#line 1553 "cs.ATG" +#line 1562 "cs.ATG" out PropertyGetRegion getBlock, out PropertySetRegion setBlock) { -#line 1555 "cs.ATG" +#line 1564 "cs.ATG" List attributes = new List(); AttributeSection section; getBlock = null; @@ -3253,96 +3265,96 @@ out PropertyGetRegion getBlock, out PropertySetRegion setBlock) { while (la.kind == 18) { AttributeSection( -#line 1562 "cs.ATG" +#line 1571 "cs.ATG" out section); -#line 1562 "cs.ATG" +#line 1571 "cs.ATG" attributes.Add(section); } if (la.kind == 83 || la.kind == 95 || la.kind == 96) { AccessorModifiers( -#line 1563 "cs.ATG" +#line 1572 "cs.ATG" out modifiers); } if ( -#line 1565 "cs.ATG" +#line 1574 "cs.ATG" IdentIsGet()) { GetAccessorDecl( -#line 1566 "cs.ATG" +#line 1575 "cs.ATG" out getBlock, attributes); -#line 1567 "cs.ATG" +#line 1576 "cs.ATG" if (modifiers != null) {getBlock.Modifier = modifiers.Modifier; } if (StartOf(22)) { -#line 1568 "cs.ATG" +#line 1577 "cs.ATG" attributes = new List(); modifiers = null; while (la.kind == 18) { AttributeSection( -#line 1569 "cs.ATG" +#line 1578 "cs.ATG" out section); -#line 1569 "cs.ATG" +#line 1578 "cs.ATG" attributes.Add(section); } if (la.kind == 83 || la.kind == 95 || la.kind == 96) { AccessorModifiers( -#line 1570 "cs.ATG" +#line 1579 "cs.ATG" out modifiers); } SetAccessorDecl( -#line 1571 "cs.ATG" +#line 1580 "cs.ATG" out setBlock, attributes); -#line 1572 "cs.ATG" +#line 1581 "cs.ATG" if (modifiers != null) {setBlock.Modifier = modifiers.Modifier; } } } else if ( -#line 1574 "cs.ATG" +#line 1583 "cs.ATG" IdentIsSet()) { SetAccessorDecl( -#line 1575 "cs.ATG" +#line 1584 "cs.ATG" out setBlock, attributes); -#line 1576 "cs.ATG" +#line 1585 "cs.ATG" if (modifiers != null) {setBlock.Modifier = modifiers.Modifier; } if (StartOf(22)) { -#line 1577 "cs.ATG" +#line 1586 "cs.ATG" attributes = new List(); modifiers = null; while (la.kind == 18) { AttributeSection( -#line 1578 "cs.ATG" +#line 1587 "cs.ATG" out section); -#line 1578 "cs.ATG" +#line 1587 "cs.ATG" attributes.Add(section); } if (la.kind == 83 || la.kind == 95 || la.kind == 96) { AccessorModifiers( -#line 1579 "cs.ATG" +#line 1588 "cs.ATG" out modifiers); } GetAccessorDecl( -#line 1580 "cs.ATG" +#line 1589 "cs.ATG" out getBlock, attributes); -#line 1581 "cs.ATG" +#line 1590 "cs.ATG" if (modifiers != null) {getBlock.Modifier = modifiers.Modifier; } } } else if (la.kind == 1) { lexer.NextToken(); -#line 1583 "cs.ATG" +#line 1592 "cs.ATG" Error("get or set accessor declaration expected"); } else SynErr(161); } void InterfaceAccessors( -#line 1631 "cs.ATG" +#line 1640 "cs.ATG" out PropertyGetRegion getBlock, out PropertySetRegion setBlock) { -#line 1633 "cs.ATG" +#line 1642 "cs.ATG" AttributeSection section; List attributes = new List(); getBlock = null; setBlock = null; @@ -3350,284 +3362,284 @@ out PropertyGetRegion getBlock, out PropertySetRegion setBlock) { while (la.kind == 18) { AttributeSection( -#line 1639 "cs.ATG" +#line 1648 "cs.ATG" out section); -#line 1639 "cs.ATG" +#line 1648 "cs.ATG" attributes.Add(section); } -#line 1640 "cs.ATG" +#line 1649 "cs.ATG" Point startLocation = la.Location; if ( -#line 1642 "cs.ATG" +#line 1651 "cs.ATG" IdentIsGet()) { Expect(1); -#line 1642 "cs.ATG" +#line 1651 "cs.ATG" getBlock = new PropertyGetRegion(null, attributes); } else if ( -#line 1643 "cs.ATG" +#line 1652 "cs.ATG" IdentIsSet()) { Expect(1); -#line 1643 "cs.ATG" +#line 1652 "cs.ATG" setBlock = new PropertySetRegion(null, attributes); } else if (la.kind == 1) { lexer.NextToken(); -#line 1644 "cs.ATG" +#line 1653 "cs.ATG" Error("set or get expected"); } else SynErr(162); Expect(11); -#line 1647 "cs.ATG" +#line 1656 "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 == 1 || la.kind == 18) { while (la.kind == 18) { AttributeSection( -#line 1651 "cs.ATG" +#line 1660 "cs.ATG" out section); -#line 1651 "cs.ATG" +#line 1660 "cs.ATG" attributes.Add(section); } -#line 1652 "cs.ATG" +#line 1661 "cs.ATG" startLocation = la.Location; if ( -#line 1654 "cs.ATG" +#line 1663 "cs.ATG" IdentIsGet()) { Expect(1); -#line 1654 "cs.ATG" +#line 1663 "cs.ATG" if (getBlock != null) Error("get already declared"); else { getBlock = new PropertyGetRegion(null, attributes); lastBlock = getBlock; } } else if ( -#line 1657 "cs.ATG" +#line 1666 "cs.ATG" IdentIsSet()) { Expect(1); -#line 1657 "cs.ATG" +#line 1666 "cs.ATG" if (setBlock != null) Error("set already declared"); else { setBlock = new PropertySetRegion(null, attributes); lastBlock = setBlock; } } else if (la.kind == 1) { lexer.NextToken(); -#line 1660 "cs.ATG" +#line 1669 "cs.ATG" Error("set or get expected"); } else SynErr(163); Expect(11); -#line 1663 "cs.ATG" +#line 1672 "cs.ATG" if (lastBlock != null) { lastBlock.StartLocation = startLocation; lastBlock.EndLocation = t.EndLocation; } } } void GetAccessorDecl( -#line 1587 "cs.ATG" +#line 1596 "cs.ATG" out PropertyGetRegion getBlock, List attributes) { -#line 1588 "cs.ATG" +#line 1597 "cs.ATG" Statement stmt = null; Expect(1); -#line 1591 "cs.ATG" +#line 1600 "cs.ATG" if (t.val != "get") Error("get expected"); -#line 1592 "cs.ATG" +#line 1601 "cs.ATG" Point startLocation = t.Location; if (la.kind == 16) { Block( -#line 1593 "cs.ATG" +#line 1602 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(164); -#line 1594 "cs.ATG" +#line 1603 "cs.ATG" getBlock = new PropertyGetRegion((BlockStatement)stmt, attributes); -#line 1595 "cs.ATG" +#line 1604 "cs.ATG" getBlock.StartLocation = startLocation; getBlock.EndLocation = t.EndLocation; } void SetAccessorDecl( -#line 1598 "cs.ATG" +#line 1607 "cs.ATG" out PropertySetRegion setBlock, List attributes) { -#line 1599 "cs.ATG" +#line 1608 "cs.ATG" Statement stmt = null; Expect(1); -#line 1602 "cs.ATG" +#line 1611 "cs.ATG" if (t.val != "set") Error("set expected"); -#line 1603 "cs.ATG" +#line 1612 "cs.ATG" Point startLocation = t.Location; if (la.kind == 16) { Block( -#line 1604 "cs.ATG" +#line 1613 "cs.ATG" out stmt); } else if (la.kind == 11) { lexer.NextToken(); } else SynErr(165); -#line 1605 "cs.ATG" +#line 1614 "cs.ATG" setBlock = new PropertySetRegion((BlockStatement)stmt, attributes); -#line 1606 "cs.ATG" +#line 1615 "cs.ATG" setBlock.StartLocation = startLocation; setBlock.EndLocation = t.EndLocation; } void AddAccessorDecl( -#line 1689 "cs.ATG" +#line 1698 "cs.ATG" out Statement stmt) { -#line 1690 "cs.ATG" +#line 1699 "cs.ATG" stmt = null; Expect(1); -#line 1693 "cs.ATG" +#line 1702 "cs.ATG" if (t.val != "add") Error("add expected"); Block( -#line 1694 "cs.ATG" +#line 1703 "cs.ATG" out stmt); } void RemoveAccessorDecl( -#line 1697 "cs.ATG" +#line 1706 "cs.ATG" out Statement stmt) { -#line 1698 "cs.ATG" +#line 1707 "cs.ATG" stmt = null; Expect(1); -#line 1701 "cs.ATG" +#line 1710 "cs.ATG" if (t.val != "remove") Error("remove expected"); Block( -#line 1702 "cs.ATG" +#line 1711 "cs.ATG" out stmt); } void VariableInitializer( -#line 1718 "cs.ATG" +#line 1727 "cs.ATG" out Expression initializerExpression) { -#line 1719 "cs.ATG" +#line 1728 "cs.ATG" TypeReference type = null; Expression expr = null; initializerExpression = null; if (StartOf(5)) { Expr( -#line 1721 "cs.ATG" +#line 1730 "cs.ATG" out initializerExpression); } else if (la.kind == 16) { ArrayInitializer( -#line 1722 "cs.ATG" +#line 1731 "cs.ATG" out initializerExpression); } else if (la.kind == 105) { lexer.NextToken(); Type( -#line 1723 "cs.ATG" +#line 1732 "cs.ATG" out type); Expect(18); Expr( -#line 1723 "cs.ATG" +#line 1732 "cs.ATG" out expr); Expect(19); -#line 1723 "cs.ATG" +#line 1732 "cs.ATG" initializerExpression = new StackAllocExpression(type, expr); } else if (la.kind == 62) { lexer.NextToken(); Expect(20); Type( -#line 1725 "cs.ATG" +#line 1734 "cs.ATG" out type); Expect(21); -#line 1725 "cs.ATG" +#line 1734 "cs.ATG" initializerExpression = new DefaultValueExpression(type); } else SynErr(166); } void Statement() { -#line 1837 "cs.ATG" +#line 1846 "cs.ATG" TypeReference type; Expression expr; Statement stmt = null; Point startPos = la.Location; if ( -#line 1845 "cs.ATG" +#line 1854 "cs.ATG" IsLabel()) { Expect(1); -#line 1845 "cs.ATG" +#line 1854 "cs.ATG" compilationUnit.AddChild(new LabelStatement(t.val)); Expect(9); Statement(); } else if (la.kind == 59) { lexer.NextToken(); Type( -#line 1848 "cs.ATG" +#line 1857 "cs.ATG" out type); -#line 1848 "cs.ATG" +#line 1857 "cs.ATG" LocalVariableDeclaration var = new LocalVariableDeclaration(type, Modifier.Const); string ident = null; var.StartLocation = t.Location; Expect(1); -#line 1849 "cs.ATG" +#line 1858 "cs.ATG" ident = t.val; Expect(3); Expr( -#line 1850 "cs.ATG" +#line 1859 "cs.ATG" out expr); -#line 1850 "cs.ATG" +#line 1859 "cs.ATG" var.Variables.Add(new VariableDeclaration(ident, expr)); while (la.kind == 14) { lexer.NextToken(); Expect(1); -#line 1851 "cs.ATG" +#line 1860 "cs.ATG" ident = t.val; Expect(3); Expr( -#line 1851 "cs.ATG" +#line 1860 "cs.ATG" out expr); -#line 1851 "cs.ATG" +#line 1860 "cs.ATG" var.Variables.Add(new VariableDeclaration(ident, expr)); } Expect(11); -#line 1852 "cs.ATG" +#line 1861 "cs.ATG" compilationUnit.AddChild(var); } else if ( -#line 1854 "cs.ATG" +#line 1863 "cs.ATG" IsLocalVarDecl()) { LocalVariableDecl( -#line 1854 "cs.ATG" +#line 1863 "cs.ATG" out stmt); Expect(11); -#line 1854 "cs.ATG" +#line 1863 "cs.ATG" compilationUnit.AddChild(stmt); } else if (StartOf(23)) { EmbeddedStatement( -#line 1855 "cs.ATG" +#line 1864 "cs.ATG" out stmt); -#line 1855 "cs.ATG" +#line 1864 "cs.ATG" compilationUnit.AddChild(stmt); } else SynErr(167); -#line 1861 "cs.ATG" +#line 1870 "cs.ATG" if (stmt != null) { stmt.StartLocation = startPos; stmt.EndLocation = t.EndLocation; @@ -3636,10 +3648,10 @@ out stmt); } void Argument( -#line 1760 "cs.ATG" +#line 1769 "cs.ATG" out Expression argumentexpr) { -#line 1762 "cs.ATG" +#line 1771 "cs.ATG" Expression expr; FieldDirection fd = FieldDirection.None; @@ -3647,48 +3659,48 @@ out Expression argumentexpr) { if (la.kind == 99) { lexer.NextToken(); -#line 1767 "cs.ATG" +#line 1776 "cs.ATG" fd = FieldDirection.Ref; } else { lexer.NextToken(); -#line 1768 "cs.ATG" +#line 1777 "cs.ATG" fd = FieldDirection.Out; } } Expr( -#line 1770 "cs.ATG" +#line 1779 "cs.ATG" out expr); -#line 1770 "cs.ATG" +#line 1779 "cs.ATG" argumentexpr = fd != FieldDirection.None ? argumentexpr = new DirectionExpression(fd, expr) : expr; } void ArrayInitializer( -#line 1790 "cs.ATG" +#line 1799 "cs.ATG" out Expression outExpr) { -#line 1792 "cs.ATG" +#line 1801 "cs.ATG" Expression expr = null; ArrayInitializerExpression initializer = new ArrayInitializerExpression(); Expect(16); if (StartOf(24)) { VariableInitializer( -#line 1797 "cs.ATG" +#line 1806 "cs.ATG" out expr); -#line 1798 "cs.ATG" +#line 1807 "cs.ATG" if (expr != null) { initializer.CreateExpressions.Add(expr); } while ( -#line 1799 "cs.ATG" +#line 1808 "cs.ATG" NotFinalComma()) { Expect(14); VariableInitializer( -#line 1800 "cs.ATG" +#line 1809 "cs.ATG" out expr); -#line 1801 "cs.ATG" +#line 1810 "cs.ATG" if (expr != null) { initializer.CreateExpressions.Add(expr); } } if (la.kind == 14) { @@ -3697,138 +3709,138 @@ out expr); } Expect(17); -#line 1805 "cs.ATG" +#line 1814 "cs.ATG" outExpr = initializer; } void AssignmentOperator( -#line 1773 "cs.ATG" +#line 1782 "cs.ATG" out AssignmentOperatorType op) { -#line 1774 "cs.ATG" +#line 1783 "cs.ATG" op = AssignmentOperatorType.None; if (la.kind == 3) { lexer.NextToken(); -#line 1776 "cs.ATG" +#line 1785 "cs.ATG" op = AssignmentOperatorType.Assign; } else if (la.kind == 38) { lexer.NextToken(); -#line 1777 "cs.ATG" +#line 1786 "cs.ATG" op = AssignmentOperatorType.Add; } else if (la.kind == 39) { lexer.NextToken(); -#line 1778 "cs.ATG" +#line 1787 "cs.ATG" op = AssignmentOperatorType.Subtract; } else if (la.kind == 40) { lexer.NextToken(); -#line 1779 "cs.ATG" +#line 1788 "cs.ATG" op = AssignmentOperatorType.Multiply; } else if (la.kind == 41) { lexer.NextToken(); -#line 1780 "cs.ATG" +#line 1789 "cs.ATG" op = AssignmentOperatorType.Divide; } else if (la.kind == 42) { lexer.NextToken(); -#line 1781 "cs.ATG" +#line 1790 "cs.ATG" op = AssignmentOperatorType.Modulus; } else if (la.kind == 43) { lexer.NextToken(); -#line 1782 "cs.ATG" +#line 1791 "cs.ATG" op = AssignmentOperatorType.BitwiseAnd; } else if (la.kind == 44) { lexer.NextToken(); -#line 1783 "cs.ATG" +#line 1792 "cs.ATG" op = AssignmentOperatorType.BitwiseOr; } else if (la.kind == 45) { lexer.NextToken(); -#line 1784 "cs.ATG" +#line 1793 "cs.ATG" op = AssignmentOperatorType.ExclusiveOr; } else if (la.kind == 46) { lexer.NextToken(); -#line 1785 "cs.ATG" +#line 1794 "cs.ATG" op = AssignmentOperatorType.ShiftLeft; } else if ( -#line 1786 "cs.ATG" +#line 1795 "cs.ATG" la.kind == Tokens.GreaterThan && Peek(1).kind == Tokens.GreaterEqual) { Expect(22); Expect(35); -#line 1787 "cs.ATG" +#line 1796 "cs.ATG" op = AssignmentOperatorType.ShiftRight; } else SynErr(168); } void LocalVariableDecl( -#line 1808 "cs.ATG" +#line 1817 "cs.ATG" out Statement stmt) { -#line 1810 "cs.ATG" +#line 1819 "cs.ATG" TypeReference type; VariableDeclaration var = null; LocalVariableDeclaration localVariableDeclaration; Type( -#line 1815 "cs.ATG" +#line 1824 "cs.ATG" out type); -#line 1815 "cs.ATG" +#line 1824 "cs.ATG" localVariableDeclaration = new LocalVariableDeclaration(type); localVariableDeclaration.StartLocation = t.Location; LocalVariableDeclarator( -#line 1816 "cs.ATG" +#line 1825 "cs.ATG" out var); -#line 1816 "cs.ATG" +#line 1825 "cs.ATG" localVariableDeclaration.Variables.Add(var); while (la.kind == 14) { lexer.NextToken(); LocalVariableDeclarator( -#line 1817 "cs.ATG" +#line 1826 "cs.ATG" out var); -#line 1817 "cs.ATG" +#line 1826 "cs.ATG" localVariableDeclaration.Variables.Add(var); } -#line 1818 "cs.ATG" +#line 1827 "cs.ATG" stmt = localVariableDeclaration; } void LocalVariableDeclarator( -#line 1821 "cs.ATG" +#line 1830 "cs.ATG" out VariableDeclaration var) { -#line 1822 "cs.ATG" +#line 1831 "cs.ATG" Expression expr = null; Expect(1); -#line 1825 "cs.ATG" +#line 1834 "cs.ATG" var = new VariableDeclaration(t.val); if (la.kind == 3) { lexer.NextToken(); VariableInitializer( -#line 1825 "cs.ATG" +#line 1834 "cs.ATG" out expr); -#line 1825 "cs.ATG" +#line 1834 "cs.ATG" var.Initializer = expr; } } void EmbeddedStatement( -#line 1868 "cs.ATG" +#line 1877 "cs.ATG" out Statement statement) { -#line 1870 "cs.ATG" +#line 1879 "cs.ATG" TypeReference type = null; Expression expr = null; Statement embeddedStatement = null; @@ -3836,57 +3848,57 @@ out Statement statement) { if (la.kind == 16) { Block( -#line 1876 "cs.ATG" +#line 1885 "cs.ATG" out statement); } else if (la.kind == 11) { lexer.NextToken(); -#line 1878 "cs.ATG" +#line 1887 "cs.ATG" statement = new EmptyStatement(); } else if ( -#line 1880 "cs.ATG" +#line 1889 "cs.ATG" UnCheckedAndLBrace()) { -#line 1880 "cs.ATG" +#line 1889 "cs.ATG" Statement block; bool isChecked = true; if (la.kind == 57) { lexer.NextToken(); } else if (la.kind == 117) { lexer.NextToken(); -#line 1881 "cs.ATG" +#line 1890 "cs.ATG" isChecked = false; } else SynErr(169); Block( -#line 1882 "cs.ATG" +#line 1891 "cs.ATG" out block); -#line 1882 "cs.ATG" +#line 1891 "cs.ATG" statement = isChecked ? (Statement)new CheckedStatement(block) : (Statement)new UncheckedStatement(block); } else if (la.kind == 78) { lexer.NextToken(); -#line 1884 "cs.ATG" +#line 1893 "cs.ATG" Statement elseStatement = null; Expect(20); Expr( -#line 1885 "cs.ATG" +#line 1894 "cs.ATG" out expr); Expect(21); EmbeddedStatement( -#line 1886 "cs.ATG" +#line 1895 "cs.ATG" out embeddedStatement); if (la.kind == 66) { lexer.NextToken(); EmbeddedStatement( -#line 1887 "cs.ATG" +#line 1896 "cs.ATG" out elseStatement); } -#line 1888 "cs.ATG" +#line 1897 "cs.ATG" statement = elseStatement != null ? new IfElseStatement(expr, embeddedStatement, elseStatement) : new IfElseStatement(expr, embeddedStatement); -#line 1889 "cs.ATG" +#line 1898 "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( @@ -3898,104 +3910,104 @@ out elseStatement); } else if (la.kind == 109) { lexer.NextToken(); -#line 1897 "cs.ATG" +#line 1906 "cs.ATG" List switchSections = new List(); SwitchSection switchSection; Expect(20); Expr( -#line 1898 "cs.ATG" +#line 1907 "cs.ATG" out expr); Expect(21); Expect(16); while (la.kind == 54 || la.kind == 62) { SwitchSection( -#line 1899 "cs.ATG" +#line 1908 "cs.ATG" out switchSection); -#line 1899 "cs.ATG" +#line 1908 "cs.ATG" switchSections.Add(switchSection); } Expect(17); -#line 1900 "cs.ATG" +#line 1909 "cs.ATG" statement = new SwitchStatement(expr, switchSections); } else if (la.kind == 124) { lexer.NextToken(); Expect(20); Expr( -#line 1902 "cs.ATG" +#line 1911 "cs.ATG" out expr); Expect(21); EmbeddedStatement( -#line 1904 "cs.ATG" +#line 1913 "cs.ATG" out embeddedStatement); -#line 1904 "cs.ATG" +#line 1913 "cs.ATG" statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.Start); } else if (la.kind == 64) { lexer.NextToken(); EmbeddedStatement( -#line 1905 "cs.ATG" +#line 1914 "cs.ATG" out embeddedStatement); Expect(124); Expect(20); Expr( -#line 1906 "cs.ATG" +#line 1915 "cs.ATG" out expr); Expect(21); Expect(11); -#line 1906 "cs.ATG" +#line 1915 "cs.ATG" statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.End); } else if (la.kind == 75) { lexer.NextToken(); -#line 1907 "cs.ATG" +#line 1916 "cs.ATG" List initializer = null; List iterator = null; Expect(20); if (StartOf(5)) { ForInitializer( -#line 1908 "cs.ATG" +#line 1917 "cs.ATG" out initializer); } Expect(11); if (StartOf(5)) { Expr( -#line 1909 "cs.ATG" +#line 1918 "cs.ATG" out expr); } Expect(11); if (StartOf(5)) { ForIterator( -#line 1910 "cs.ATG" +#line 1919 "cs.ATG" out iterator); } Expect(21); EmbeddedStatement( -#line 1911 "cs.ATG" +#line 1920 "cs.ATG" out embeddedStatement); -#line 1911 "cs.ATG" +#line 1920 "cs.ATG" statement = new ForStatement(initializer, expr, iterator, embeddedStatement); } else if (la.kind == 76) { lexer.NextToken(); Expect(20); Type( -#line 1912 "cs.ATG" +#line 1921 "cs.ATG" out type); Expect(1); -#line 1912 "cs.ATG" +#line 1921 "cs.ATG" string varName = t.val; Point start = t.Location; Expect(80); Expr( -#line 1913 "cs.ATG" +#line 1922 "cs.ATG" out expr); Expect(21); EmbeddedStatement( -#line 1914 "cs.ATG" +#line 1923 "cs.ATG" out embeddedStatement); -#line 1914 "cs.ATG" +#line 1923 "cs.ATG" statement = new ForeachStatement(type, varName , expr, embeddedStatement); statement.EndLocation = t.EndLocation; @@ -4003,34 +4015,34 @@ out embeddedStatement); lexer.NextToken(); Expect(11); -#line 1918 "cs.ATG" +#line 1927 "cs.ATG" statement = new BreakStatement(); } else if (la.kind == 60) { lexer.NextToken(); Expect(11); -#line 1919 "cs.ATG" +#line 1928 "cs.ATG" statement = new ContinueStatement(); } else if (la.kind == 77) { GotoStatement( -#line 1920 "cs.ATG" +#line 1929 "cs.ATG" out statement); } else if ( -#line 1921 "cs.ATG" +#line 1930 "cs.ATG" IsYieldStatement()) { Expect(1); if (la.kind == 100) { lexer.NextToken(); Expr( -#line 1921 "cs.ATG" +#line 1930 "cs.ATG" out expr); -#line 1921 "cs.ATG" +#line 1930 "cs.ATG" statement = new YieldStatement(new ReturnStatement(expr)); } else if (la.kind == 52) { lexer.NextToken(); -#line 1922 "cs.ATG" +#line 1931 "cs.ATG" statement = new YieldStatement(new BreakStatement()); } else SynErr(170); Expect(11); @@ -4038,488 +4050,488 @@ out expr); lexer.NextToken(); if (StartOf(5)) { Expr( -#line 1923 "cs.ATG" +#line 1932 "cs.ATG" out expr); } Expect(11); -#line 1923 "cs.ATG" +#line 1932 "cs.ATG" statement = new ReturnStatement(expr); } else if (la.kind == 111) { lexer.NextToken(); if (StartOf(5)) { Expr( -#line 1924 "cs.ATG" +#line 1933 "cs.ATG" out expr); } Expect(11); -#line 1924 "cs.ATG" +#line 1933 "cs.ATG" statement = new ThrowStatement(expr); } else if (StartOf(5)) { StatementExpr( -#line 1927 "cs.ATG" +#line 1936 "cs.ATG" out statement); Expect(11); } else if (la.kind == 113) { TryStatement( -#line 1929 "cs.ATG" +#line 1938 "cs.ATG" out statement); } else if (la.kind == 85) { lexer.NextToken(); Expect(20); Expr( -#line 1931 "cs.ATG" +#line 1940 "cs.ATG" out expr); Expect(21); EmbeddedStatement( -#line 1932 "cs.ATG" +#line 1941 "cs.ATG" out embeddedStatement); -#line 1932 "cs.ATG" +#line 1941 "cs.ATG" statement = new LockStatement(expr, embeddedStatement); } else if (la.kind == 120) { -#line 1934 "cs.ATG" +#line 1943 "cs.ATG" Statement resourceAcquisitionStmt = null; lexer.NextToken(); Expect(20); ResourceAcquisition( -#line 1936 "cs.ATG" +#line 1945 "cs.ATG" out resourceAcquisitionStmt); Expect(21); EmbeddedStatement( -#line 1937 "cs.ATG" +#line 1946 "cs.ATG" out embeddedStatement); -#line 1937 "cs.ATG" +#line 1946 "cs.ATG" statement = new UsingStatement(resourceAcquisitionStmt, embeddedStatement); } else if (la.kind == 118) { lexer.NextToken(); Block( -#line 1939 "cs.ATG" +#line 1948 "cs.ATG" out embeddedStatement); -#line 1939 "cs.ATG" +#line 1948 "cs.ATG" statement = new UnsafeStatement(embeddedStatement); } else if (la.kind == 73) { lexer.NextToken(); Expect(20); Type( -#line 1942 "cs.ATG" +#line 1951 "cs.ATG" out type); -#line 1942 "cs.ATG" +#line 1951 "cs.ATG" if (type.PointerNestingLevel == 0) Error("can only fix pointer types"); List pointerDeclarators = new List(1); Expect(1); -#line 1945 "cs.ATG" +#line 1954 "cs.ATG" string identifier = t.val; Expect(3); Expr( -#line 1946 "cs.ATG" +#line 1955 "cs.ATG" out expr); -#line 1946 "cs.ATG" +#line 1955 "cs.ATG" pointerDeclarators.Add(new VariableDeclaration(identifier, expr)); while (la.kind == 14) { lexer.NextToken(); Expect(1); -#line 1948 "cs.ATG" +#line 1957 "cs.ATG" identifier = t.val; Expect(3); Expr( -#line 1949 "cs.ATG" +#line 1958 "cs.ATG" out expr); -#line 1949 "cs.ATG" +#line 1958 "cs.ATG" pointerDeclarators.Add(new VariableDeclaration(identifier, expr)); } Expect(21); EmbeddedStatement( -#line 1951 "cs.ATG" +#line 1960 "cs.ATG" out embeddedStatement); -#line 1951 "cs.ATG" +#line 1960 "cs.ATG" statement = new FixedStatement(type, pointerDeclarators, embeddedStatement); } else SynErr(171); } void SwitchSection( -#line 1973 "cs.ATG" +#line 1982 "cs.ATG" out SwitchSection stmt) { -#line 1975 "cs.ATG" +#line 1984 "cs.ATG" SwitchSection switchSection = new SwitchSection(); CaseLabel label; SwitchLabel( -#line 1979 "cs.ATG" +#line 1988 "cs.ATG" out label); -#line 1979 "cs.ATG" +#line 1988 "cs.ATG" if (label != null) { switchSection.SwitchLabels.Add(label); } while (la.kind == 54 || la.kind == 62) { SwitchLabel( -#line 1981 "cs.ATG" +#line 1990 "cs.ATG" out label); -#line 1981 "cs.ATG" +#line 1990 "cs.ATG" if (label != null) { switchSection.SwitchLabels.Add(label); } } -#line 1983 "cs.ATG" +#line 1992 "cs.ATG" compilationUnit.BlockStart(switchSection); Statement(); while (StartOf(20)) { Statement(); } -#line 1986 "cs.ATG" +#line 1995 "cs.ATG" compilationUnit.BlockEnd(); stmt = switchSection; } void ForInitializer( -#line 1954 "cs.ATG" +#line 1963 "cs.ATG" out List initializer) { -#line 1956 "cs.ATG" +#line 1965 "cs.ATG" Statement stmt; initializer = new List(); if ( -#line 1960 "cs.ATG" +#line 1969 "cs.ATG" IsLocalVarDecl()) { LocalVariableDecl( -#line 1960 "cs.ATG" +#line 1969 "cs.ATG" out stmt); -#line 1960 "cs.ATG" +#line 1969 "cs.ATG" initializer.Add(stmt); } else if (StartOf(5)) { StatementExpr( -#line 1961 "cs.ATG" +#line 1970 "cs.ATG" out stmt); -#line 1961 "cs.ATG" +#line 1970 "cs.ATG" initializer.Add(stmt); while (la.kind == 14) { lexer.NextToken(); StatementExpr( -#line 1961 "cs.ATG" +#line 1970 "cs.ATG" out stmt); -#line 1961 "cs.ATG" +#line 1970 "cs.ATG" initializer.Add(stmt); } } else SynErr(172); } void ForIterator( -#line 1964 "cs.ATG" +#line 1973 "cs.ATG" out List iterator) { -#line 1966 "cs.ATG" +#line 1975 "cs.ATG" Statement stmt; iterator = new List(); StatementExpr( -#line 1970 "cs.ATG" +#line 1979 "cs.ATG" out stmt); -#line 1970 "cs.ATG" +#line 1979 "cs.ATG" iterator.Add(stmt); while (la.kind == 14) { lexer.NextToken(); StatementExpr( -#line 1970 "cs.ATG" +#line 1979 "cs.ATG" out stmt); -#line 1970 "cs.ATG" +#line 1979 "cs.ATG" iterator.Add(stmt); } } void GotoStatement( -#line 2041 "cs.ATG" +#line 2050 "cs.ATG" out Statement stmt) { -#line 2042 "cs.ATG" +#line 2051 "cs.ATG" Expression expr; stmt = null; Expect(77); if (la.kind == 1) { lexer.NextToken(); -#line 2046 "cs.ATG" +#line 2055 "cs.ATG" stmt = new GotoStatement(t.val); Expect(11); } else if (la.kind == 54) { lexer.NextToken(); Expr( -#line 2047 "cs.ATG" +#line 2056 "cs.ATG" out expr); Expect(11); -#line 2047 "cs.ATG" +#line 2056 "cs.ATG" stmt = new GotoCaseStatement(expr); } else if (la.kind == 62) { lexer.NextToken(); Expect(11); -#line 2048 "cs.ATG" +#line 2057 "cs.ATG" stmt = new GotoCaseStatement(null); } else SynErr(173); } void StatementExpr( -#line 2068 "cs.ATG" +#line 2077 "cs.ATG" out Statement stmt) { -#line 2069 "cs.ATG" +#line 2078 "cs.ATG" Expression expr; Expr( -#line 2071 "cs.ATG" +#line 2080 "cs.ATG" out expr); -#line 2074 "cs.ATG" +#line 2083 "cs.ATG" stmt = new StatementExpression(expr); } void TryStatement( -#line 1998 "cs.ATG" +#line 2007 "cs.ATG" out Statement tryStatement) { -#line 2000 "cs.ATG" +#line 2009 "cs.ATG" Statement blockStmt = null, finallyStmt = null; List catchClauses = null; Expect(113); Block( -#line 2004 "cs.ATG" +#line 2013 "cs.ATG" out blockStmt); if (la.kind == 55) { CatchClauses( -#line 2006 "cs.ATG" +#line 2015 "cs.ATG" out catchClauses); if (la.kind == 72) { lexer.NextToken(); Block( -#line 2006 "cs.ATG" +#line 2015 "cs.ATG" out finallyStmt); } } else if (la.kind == 72) { lexer.NextToken(); Block( -#line 2007 "cs.ATG" +#line 2016 "cs.ATG" out finallyStmt); } else SynErr(174); -#line 2010 "cs.ATG" +#line 2019 "cs.ATG" tryStatement = new TryCatchStatement(blockStmt, catchClauses, finallyStmt); } void ResourceAcquisition( -#line 2052 "cs.ATG" +#line 2061 "cs.ATG" out Statement stmt) { -#line 2054 "cs.ATG" +#line 2063 "cs.ATG" stmt = null; Expression expr; if ( -#line 2059 "cs.ATG" +#line 2068 "cs.ATG" IsLocalVarDecl()) { LocalVariableDecl( -#line 2059 "cs.ATG" +#line 2068 "cs.ATG" out stmt); } else if (StartOf(5)) { Expr( -#line 2060 "cs.ATG" +#line 2069 "cs.ATG" out expr); -#line 2064 "cs.ATG" +#line 2073 "cs.ATG" stmt = new StatementExpression(expr); } else SynErr(175); } void SwitchLabel( -#line 1991 "cs.ATG" +#line 2000 "cs.ATG" out CaseLabel label) { -#line 1992 "cs.ATG" +#line 2001 "cs.ATG" Expression expr = null; label = null; if (la.kind == 54) { lexer.NextToken(); Expr( -#line 1994 "cs.ATG" +#line 2003 "cs.ATG" out expr); Expect(9); -#line 1994 "cs.ATG" +#line 2003 "cs.ATG" label = new CaseLabel(expr); } else if (la.kind == 62) { lexer.NextToken(); Expect(9); -#line 1995 "cs.ATG" +#line 2004 "cs.ATG" label = new CaseLabel(); } else SynErr(176); } void CatchClauses( -#line 2015 "cs.ATG" +#line 2024 "cs.ATG" out List catchClauses) { -#line 2017 "cs.ATG" +#line 2026 "cs.ATG" catchClauses = new List(); Expect(55); -#line 2020 "cs.ATG" +#line 2029 "cs.ATG" string identifier; Statement stmt; TypeReference typeRef; if (la.kind == 16) { Block( -#line 2026 "cs.ATG" +#line 2035 "cs.ATG" out stmt); -#line 2026 "cs.ATG" +#line 2035 "cs.ATG" catchClauses.Add(new CatchClause(stmt)); } else if (la.kind == 20) { lexer.NextToken(); ClassType( -#line 2028 "cs.ATG" +#line 2037 "cs.ATG" out typeRef, false); -#line 2028 "cs.ATG" +#line 2037 "cs.ATG" identifier = null; if (la.kind == 1) { lexer.NextToken(); -#line 2029 "cs.ATG" +#line 2038 "cs.ATG" identifier = t.val; } Expect(21); Block( -#line 2030 "cs.ATG" +#line 2039 "cs.ATG" out stmt); -#line 2031 "cs.ATG" +#line 2040 "cs.ATG" catchClauses.Add(new CatchClause(typeRef, identifier, stmt)); while ( -#line 2032 "cs.ATG" +#line 2041 "cs.ATG" IsTypedCatch()) { Expect(55); Expect(20); ClassType( -#line 2032 "cs.ATG" +#line 2041 "cs.ATG" out typeRef, false); -#line 2032 "cs.ATG" +#line 2041 "cs.ATG" identifier = null; if (la.kind == 1) { lexer.NextToken(); -#line 2033 "cs.ATG" +#line 2042 "cs.ATG" identifier = t.val; } Expect(21); Block( -#line 2034 "cs.ATG" +#line 2043 "cs.ATG" out stmt); -#line 2035 "cs.ATG" +#line 2044 "cs.ATG" catchClauses.Add(new CatchClause(typeRef, identifier, stmt)); } if (la.kind == 55) { lexer.NextToken(); Block( -#line 2037 "cs.ATG" +#line 2046 "cs.ATG" out stmt); -#line 2037 "cs.ATG" +#line 2046 "cs.ATG" catchClauses.Add(new CatchClause(stmt)); } } else SynErr(177); } void UnaryExpr( -#line 2095 "cs.ATG" +#line 2104 "cs.ATG" out Expression uExpr) { -#line 2097 "cs.ATG" +#line 2106 "cs.ATG" TypeReference type = null; Expression expr; ArrayList expressions = new ArrayList(); uExpr = null; while (StartOf(25) || -#line 2119 "cs.ATG" +#line 2128 "cs.ATG" IsTypeCast()) { if (la.kind == 4) { lexer.NextToken(); -#line 2106 "cs.ATG" +#line 2115 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Plus)); } else if (la.kind == 5) { lexer.NextToken(); -#line 2107 "cs.ATG" +#line 2116 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Minus)); } else if (la.kind == 24) { lexer.NextToken(); -#line 2108 "cs.ATG" +#line 2117 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Not)); } else if (la.kind == 27) { lexer.NextToken(); -#line 2109 "cs.ATG" +#line 2118 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.BitNot)); } else if (la.kind == 6) { lexer.NextToken(); -#line 2110 "cs.ATG" +#line 2119 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Star)); } else if (la.kind == 31) { lexer.NextToken(); -#line 2111 "cs.ATG" +#line 2120 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Increment)); } else if (la.kind == 32) { lexer.NextToken(); -#line 2112 "cs.ATG" +#line 2121 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.Decrement)); } else if (la.kind == 28) { lexer.NextToken(); -#line 2113 "cs.ATG" +#line 2122 "cs.ATG" expressions.Add(new UnaryOperatorExpression(UnaryOperatorType.BitWiseAnd)); } else { Expect(20); Type( -#line 2119 "cs.ATG" +#line 2128 "cs.ATG" out type); Expect(21); -#line 2119 "cs.ATG" +#line 2128 "cs.ATG" expressions.Add(new CastExpression(type)); } } PrimaryExpr( -#line 2123 "cs.ATG" +#line 2132 "cs.ATG" out expr); -#line 2123 "cs.ATG" +#line 2132 "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) { @@ -4537,33 +4549,33 @@ out expr); } void ConditionalOrExpr( -#line 2294 "cs.ATG" +#line 2303 "cs.ATG" ref Expression outExpr) { -#line 2295 "cs.ATG" +#line 2304 "cs.ATG" Expression expr; ConditionalAndExpr( -#line 2297 "cs.ATG" +#line 2306 "cs.ATG" ref outExpr); while (la.kind == 26) { lexer.NextToken(); UnaryExpr( -#line 2297 "cs.ATG" +#line 2306 "cs.ATG" out expr); ConditionalAndExpr( -#line 2297 "cs.ATG" +#line 2306 "cs.ATG" ref expr); -#line 2297 "cs.ATG" +#line 2306 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.LogicalOr, expr); } } void PrimaryExpr( -#line 2140 "cs.ATG" +#line 2149 "cs.ATG" out Expression pexpr) { -#line 2142 "cs.ATG" +#line 2151 "cs.ATG" TypeReference type = null; List typeList = null; bool isArrayCreation = false; @@ -4573,332 +4585,332 @@ out Expression pexpr) { if (la.kind == 112) { lexer.NextToken(); -#line 2150 "cs.ATG" +#line 2159 "cs.ATG" pexpr = new PrimitiveExpression(true, "true"); } else if (la.kind == 71) { lexer.NextToken(); -#line 2151 "cs.ATG" +#line 2160 "cs.ATG" pexpr = new PrimitiveExpression(false, "false"); } else if (la.kind == 89) { lexer.NextToken(); -#line 2152 "cs.ATG" +#line 2161 "cs.ATG" pexpr = new PrimitiveExpression(null, "null"); } else if (la.kind == 2) { lexer.NextToken(); -#line 2153 "cs.ATG" +#line 2162 "cs.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); } else if ( -#line 2154 "cs.ATG" +#line 2163 "cs.ATG" la.kind == Tokens.Identifier && Peek(1).kind == Tokens.DoubleColon) { Expect(1); -#line 2155 "cs.ATG" +#line 2164 "cs.ATG" type = new TypeReference(t.val); Expect(10); -#line 2156 "cs.ATG" +#line 2165 "cs.ATG" pexpr = new TypeReferenceExpression(type); Expect(1); -#line 2157 "cs.ATG" +#line 2166 "cs.ATG" if (type.Type == "global") { type.IsGlobal = true; type.Type = (t.val ?? "?"); } else type.Type += "." + (t.val ?? "?"); } else if (la.kind == 1) { lexer.NextToken(); -#line 2159 "cs.ATG" +#line 2168 "cs.ATG" pexpr = new IdentifierExpression(t.val); } else if (la.kind == 20) { lexer.NextToken(); Expr( -#line 2161 "cs.ATG" +#line 2170 "cs.ATG" out expr); Expect(21); -#line 2161 "cs.ATG" +#line 2170 "cs.ATG" pexpr = new ParenthesizedExpression(expr); } else if (StartOf(26)) { -#line 2163 "cs.ATG" +#line 2172 "cs.ATG" string val = null; switch (la.kind) { case 51: { lexer.NextToken(); -#line 2165 "cs.ATG" +#line 2174 "cs.ATG" val = "bool"; break; } case 53: { lexer.NextToken(); -#line 2166 "cs.ATG" +#line 2175 "cs.ATG" val = "byte"; break; } case 56: { lexer.NextToken(); -#line 2167 "cs.ATG" +#line 2176 "cs.ATG" val = "char"; break; } case 61: { lexer.NextToken(); -#line 2168 "cs.ATG" +#line 2177 "cs.ATG" val = "decimal"; break; } case 65: { lexer.NextToken(); -#line 2169 "cs.ATG" +#line 2178 "cs.ATG" val = "double"; break; } case 74: { lexer.NextToken(); -#line 2170 "cs.ATG" +#line 2179 "cs.ATG" val = "float"; break; } case 81: { lexer.NextToken(); -#line 2171 "cs.ATG" +#line 2180 "cs.ATG" val = "int"; break; } case 86: { lexer.NextToken(); -#line 2172 "cs.ATG" +#line 2181 "cs.ATG" val = "long"; break; } case 90: { lexer.NextToken(); -#line 2173 "cs.ATG" +#line 2182 "cs.ATG" val = "object"; break; } case 101: { lexer.NextToken(); -#line 2174 "cs.ATG" +#line 2183 "cs.ATG" val = "sbyte"; break; } case 103: { lexer.NextToken(); -#line 2175 "cs.ATG" +#line 2184 "cs.ATG" val = "short"; break; } case 107: { lexer.NextToken(); -#line 2176 "cs.ATG" +#line 2185 "cs.ATG" val = "string"; break; } case 115: { lexer.NextToken(); -#line 2177 "cs.ATG" +#line 2186 "cs.ATG" val = "uint"; break; } case 116: { lexer.NextToken(); -#line 2178 "cs.ATG" +#line 2187 "cs.ATG" val = "ulong"; break; } case 119: { lexer.NextToken(); -#line 2179 "cs.ATG" +#line 2188 "cs.ATG" val = "ushort"; break; } } -#line 2180 "cs.ATG" +#line 2189 "cs.ATG" t.val = ""; Expect(15); Expect(1); -#line 2180 "cs.ATG" +#line 2189 "cs.ATG" pexpr = new FieldReferenceExpression(new TypeReferenceExpression(val), t.val); } else if (la.kind == 110) { lexer.NextToken(); -#line 2182 "cs.ATG" +#line 2191 "cs.ATG" pexpr = new ThisReferenceExpression(); } else if (la.kind == 50) { lexer.NextToken(); -#line 2184 "cs.ATG" +#line 2193 "cs.ATG" Expression retExpr = new BaseReferenceExpression(); if (la.kind == 15) { lexer.NextToken(); Expect(1); -#line 2186 "cs.ATG" +#line 2195 "cs.ATG" retExpr = new FieldReferenceExpression(retExpr, t.val); } else if (la.kind == 18) { lexer.NextToken(); Expr( -#line 2187 "cs.ATG" +#line 2196 "cs.ATG" out expr); -#line 2187 "cs.ATG" +#line 2196 "cs.ATG" List indices = new List(); if (expr != null) { indices.Add(expr); } while (la.kind == 14) { lexer.NextToken(); Expr( -#line 2188 "cs.ATG" +#line 2197 "cs.ATG" out expr); -#line 2188 "cs.ATG" +#line 2197 "cs.ATG" if (expr != null) { indices.Add(expr); } } Expect(19); -#line 2189 "cs.ATG" +#line 2198 "cs.ATG" retExpr = new IndexerExpression(retExpr, indices); } else SynErr(178); -#line 2190 "cs.ATG" +#line 2199 "cs.ATG" pexpr = retExpr; } else if (la.kind == 88) { lexer.NextToken(); NonArrayType( -#line 2191 "cs.ATG" +#line 2200 "cs.ATG" out type); -#line 2192 "cs.ATG" +#line 2201 "cs.ATG" List parameters = new List(); if (la.kind == 20) { lexer.NextToken(); -#line 2197 "cs.ATG" +#line 2206 "cs.ATG" ObjectCreateExpression oce = new ObjectCreateExpression(type, parameters); if (StartOf(21)) { Argument( -#line 2198 "cs.ATG" +#line 2207 "cs.ATG" out expr); -#line 2198 "cs.ATG" +#line 2207 "cs.ATG" if (expr != null) { parameters.Add(expr); } while (la.kind == 14) { lexer.NextToken(); Argument( -#line 2199 "cs.ATG" +#line 2208 "cs.ATG" out expr); -#line 2199 "cs.ATG" +#line 2208 "cs.ATG" if (expr != null) { parameters.Add(expr); } } } Expect(21); -#line 2201 "cs.ATG" +#line 2210 "cs.ATG" pexpr = oce; } else if (la.kind == 18) { lexer.NextToken(); -#line 2203 "cs.ATG" +#line 2212 "cs.ATG" isArrayCreation = true; ArrayCreateExpression ace = new ArrayCreateExpression(type); pexpr = ace; -#line 2204 "cs.ATG" +#line 2213 "cs.ATG" int dims = 0; List ranks = new List(); if (la.kind == 14 || la.kind == 19) { while (la.kind == 14) { lexer.NextToken(); -#line 2206 "cs.ATG" +#line 2215 "cs.ATG" dims += 1; } Expect(19); -#line 2207 "cs.ATG" +#line 2216 "cs.ATG" ranks.Add(dims); dims = 0; while (la.kind == 18) { lexer.NextToken(); while (la.kind == 14) { lexer.NextToken(); -#line 2208 "cs.ATG" +#line 2217 "cs.ATG" ++dims; } Expect(19); -#line 2208 "cs.ATG" +#line 2217 "cs.ATG" ranks.Add(dims); dims = 0; } -#line 2209 "cs.ATG" +#line 2218 "cs.ATG" ace.CreateType.RankSpecifier = ranks.ToArray(); ArrayInitializer( -#line 2210 "cs.ATG" +#line 2219 "cs.ATG" out expr); -#line 2210 "cs.ATG" +#line 2219 "cs.ATG" ace.ArrayInitializer = (ArrayInitializerExpression)expr; } else if (StartOf(5)) { Expr( -#line 2211 "cs.ATG" +#line 2220 "cs.ATG" out expr); -#line 2211 "cs.ATG" +#line 2220 "cs.ATG" if (expr != null) parameters.Add(expr); while (la.kind == 14) { lexer.NextToken(); -#line 2212 "cs.ATG" +#line 2221 "cs.ATG" dims += 1; Expr( -#line 2213 "cs.ATG" +#line 2222 "cs.ATG" out expr); -#line 2213 "cs.ATG" +#line 2222 "cs.ATG" if (expr != null) parameters.Add(expr); } Expect(19); -#line 2215 "cs.ATG" +#line 2224 "cs.ATG" ranks.Add(dims); ace.Arguments = parameters; dims = 0; while (la.kind == 18) { lexer.NextToken(); while (la.kind == 14) { lexer.NextToken(); -#line 2216 "cs.ATG" +#line 2225 "cs.ATG" ++dims; } Expect(19); -#line 2216 "cs.ATG" +#line 2225 "cs.ATG" ranks.Add(dims); dims = 0; } -#line 2217 "cs.ATG" +#line 2226 "cs.ATG" ace.CreateType.RankSpecifier = ranks.ToArray(); if (la.kind == 16) { ArrayInitializer( -#line 2218 "cs.ATG" +#line 2227 "cs.ATG" out expr); -#line 2218 "cs.ATG" +#line 2227 "cs.ATG" ace.ArrayInitializer = (ArrayInitializerExpression)expr; } } else SynErr(179); @@ -4907,204 +4919,204 @@ out expr); lexer.NextToken(); Expect(20); if ( -#line 2223 "cs.ATG" +#line 2232 "cs.ATG" NotVoidPointer()) { Expect(122); -#line 2223 "cs.ATG" +#line 2232 "cs.ATG" type = new TypeReference("void"); } else if (StartOf(9)) { TypeWithRestriction( -#line 2224 "cs.ATG" +#line 2233 "cs.ATG" out type, true, true); } else SynErr(181); Expect(21); -#line 2225 "cs.ATG" +#line 2234 "cs.ATG" pexpr = new TypeOfExpression(type); } else if ( -#line 2227 "cs.ATG" +#line 2236 "cs.ATG" la.kind == Tokens.Default && Peek(1).kind == Tokens.OpenParenthesis) { Expect(62); Expect(20); Type( -#line 2229 "cs.ATG" +#line 2238 "cs.ATG" out type); Expect(21); -#line 2229 "cs.ATG" +#line 2238 "cs.ATG" pexpr = new DefaultValueExpression(type); } else if (la.kind == 104) { lexer.NextToken(); Expect(20); Type( -#line 2230 "cs.ATG" +#line 2239 "cs.ATG" out type); Expect(21); -#line 2230 "cs.ATG" +#line 2239 "cs.ATG" pexpr = new SizeOfExpression(type); } else if (la.kind == 57) { lexer.NextToken(); Expect(20); Expr( -#line 2231 "cs.ATG" +#line 2240 "cs.ATG" out expr); Expect(21); -#line 2231 "cs.ATG" +#line 2240 "cs.ATG" pexpr = new CheckedExpression(expr); } else if (la.kind == 117) { lexer.NextToken(); Expect(20); Expr( -#line 2232 "cs.ATG" +#line 2241 "cs.ATG" out expr); Expect(21); -#line 2232 "cs.ATG" +#line 2241 "cs.ATG" pexpr = new UncheckedExpression(expr); } else if (la.kind == 63) { lexer.NextToken(); AnonymousMethodExpr( -#line 2233 "cs.ATG" +#line 2242 "cs.ATG" out expr); -#line 2233 "cs.ATG" +#line 2242 "cs.ATG" pexpr = expr; } else SynErr(182); while (StartOf(27) || -#line 2244 "cs.ATG" -IsGenericFollowedBy(Tokens.Dot) && IsTypeReferenceExpression(pexpr) || #line 2253 "cs.ATG" +IsGenericFollowedBy(Tokens.Dot) && IsTypeReferenceExpression(pexpr) || +#line 2262 "cs.ATG" IsGenericFollowedBy(Tokens.OpenParenthesis)) { if (la.kind == 31 || la.kind == 32) { if (la.kind == 31) { lexer.NextToken(); -#line 2237 "cs.ATG" +#line 2246 "cs.ATG" pexpr = new UnaryOperatorExpression(pexpr, UnaryOperatorType.PostIncrement); } else if (la.kind == 32) { lexer.NextToken(); -#line 2238 "cs.ATG" +#line 2247 "cs.ATG" pexpr = new UnaryOperatorExpression(pexpr, UnaryOperatorType.PostDecrement); } else SynErr(183); } else if (la.kind == 47) { lexer.NextToken(); Expect(1); -#line 2241 "cs.ATG" +#line 2250 "cs.ATG" pexpr = new PointerReferenceExpression(pexpr, t.val); } else if (la.kind == 15) { lexer.NextToken(); Expect(1); -#line 2242 "cs.ATG" +#line 2251 "cs.ATG" pexpr = new FieldReferenceExpression(pexpr, t.val); } else if ( -#line 2244 "cs.ATG" +#line 2253 "cs.ATG" IsGenericFollowedBy(Tokens.Dot) && IsTypeReferenceExpression(pexpr)) { TypeArgumentList( -#line 2245 "cs.ATG" +#line 2254 "cs.ATG" out typeList, false); Expect(15); Expect(1); -#line 2247 "cs.ATG" +#line 2256 "cs.ATG" pexpr = new FieldReferenceExpression(GetTypeReferenceExpression(pexpr, typeList), t.val); } else if (la.kind == 20) { lexer.NextToken(); -#line 2249 "cs.ATG" +#line 2258 "cs.ATG" List parameters = new List(); if (StartOf(21)) { Argument( -#line 2250 "cs.ATG" +#line 2259 "cs.ATG" out expr); -#line 2250 "cs.ATG" +#line 2259 "cs.ATG" if (expr != null) {parameters.Add(expr);} while (la.kind == 14) { lexer.NextToken(); Argument( -#line 2251 "cs.ATG" +#line 2260 "cs.ATG" out expr); -#line 2251 "cs.ATG" +#line 2260 "cs.ATG" if (expr != null) {parameters.Add(expr);} } } Expect(21); -#line 2252 "cs.ATG" +#line 2261 "cs.ATG" pexpr = new InvocationExpression(pexpr, parameters); } else if ( -#line 2253 "cs.ATG" +#line 2262 "cs.ATG" IsGenericFollowedBy(Tokens.OpenParenthesis)) { TypeArgumentList( -#line 2253 "cs.ATG" +#line 2262 "cs.ATG" out typeList, false); Expect(20); -#line 2254 "cs.ATG" +#line 2263 "cs.ATG" List parameters = new List(); if (StartOf(21)) { Argument( -#line 2255 "cs.ATG" +#line 2264 "cs.ATG" out expr); -#line 2255 "cs.ATG" +#line 2264 "cs.ATG" if (expr != null) {parameters.Add(expr);} while (la.kind == 14) { lexer.NextToken(); Argument( -#line 2256 "cs.ATG" +#line 2265 "cs.ATG" out expr); -#line 2256 "cs.ATG" +#line 2265 "cs.ATG" if (expr != null) {parameters.Add(expr);} } } Expect(21); -#line 2257 "cs.ATG" +#line 2266 "cs.ATG" pexpr = new InvocationExpression(pexpr, parameters, typeList); } else { -#line 2259 "cs.ATG" +#line 2268 "cs.ATG" if (isArrayCreation) Error("element access not allow on array creation"); List indices = new List(); lexer.NextToken(); Expr( -#line 2262 "cs.ATG" +#line 2271 "cs.ATG" out expr); -#line 2262 "cs.ATG" +#line 2271 "cs.ATG" if (expr != null) { indices.Add(expr); } while (la.kind == 14) { lexer.NextToken(); Expr( -#line 2263 "cs.ATG" +#line 2272 "cs.ATG" out expr); -#line 2263 "cs.ATG" +#line 2272 "cs.ATG" if (expr != null) { indices.Add(expr); } } Expect(19); -#line 2264 "cs.ATG" +#line 2273 "cs.ATG" pexpr = new IndexerExpression(pexpr, indices); } } } void AnonymousMethodExpr( -#line 2268 "cs.ATG" +#line 2277 "cs.ATG" out Expression outExpr) { -#line 2270 "cs.ATG" +#line 2279 "cs.ATG" AnonymousMethodExpression expr = new AnonymousMethodExpression(); expr.StartLocation = t.Location; Statement stmt; @@ -5115,74 +5127,74 @@ out Expression outExpr) { lexer.NextToken(); if (StartOf(10)) { FormalParameterList( -#line 2279 "cs.ATG" +#line 2288 "cs.ATG" p); -#line 2279 "cs.ATG" +#line 2288 "cs.ATG" expr.Parameters = p; } Expect(21); } -#line 2284 "cs.ATG" +#line 2293 "cs.ATG" if (compilationUnit != null) { Block( -#line 2285 "cs.ATG" +#line 2294 "cs.ATG" out stmt); -#line 2285 "cs.ATG" +#line 2294 "cs.ATG" expr.Body = (BlockStatement)stmt; -#line 2286 "cs.ATG" +#line 2295 "cs.ATG" } else { Expect(16); -#line 2288 "cs.ATG" +#line 2297 "cs.ATG" lexer.SkipCurrentBlock(); Expect(17); -#line 2290 "cs.ATG" +#line 2299 "cs.ATG" } -#line 2291 "cs.ATG" +#line 2300 "cs.ATG" expr.EndLocation = t.Location; } void TypeArgumentList( -#line 2464 "cs.ATG" +#line 2473 "cs.ATG" out List types, bool canBeUnbound) { -#line 2466 "cs.ATG" +#line 2475 "cs.ATG" types = new List(); TypeReference type = null; Expect(23); if ( -#line 2471 "cs.ATG" +#line 2480 "cs.ATG" canBeUnbound && (la.kind == Tokens.GreaterThan || la.kind == Tokens.Comma)) { -#line 2472 "cs.ATG" +#line 2481 "cs.ATG" types.Add(TypeReference.Null); while (la.kind == 14) { lexer.NextToken(); -#line 2473 "cs.ATG" +#line 2482 "cs.ATG" types.Add(TypeReference.Null); } } else if (StartOf(9)) { Type( -#line 2474 "cs.ATG" +#line 2483 "cs.ATG" out type); -#line 2474 "cs.ATG" +#line 2483 "cs.ATG" types.Add(type); while (la.kind == 14) { lexer.NextToken(); Type( -#line 2475 "cs.ATG" +#line 2484 "cs.ATG" out type); -#line 2475 "cs.ATG" +#line 2484 "cs.ATG" types.Add(type); } } else SynErr(184); @@ -5190,206 +5202,206 @@ out type); } void ConditionalAndExpr( -#line 2300 "cs.ATG" +#line 2309 "cs.ATG" ref Expression outExpr) { -#line 2301 "cs.ATG" +#line 2310 "cs.ATG" Expression expr; InclusiveOrExpr( -#line 2303 "cs.ATG" +#line 2312 "cs.ATG" ref outExpr); while (la.kind == 25) { lexer.NextToken(); UnaryExpr( -#line 2303 "cs.ATG" +#line 2312 "cs.ATG" out expr); InclusiveOrExpr( -#line 2303 "cs.ATG" +#line 2312 "cs.ATG" ref expr); -#line 2303 "cs.ATG" +#line 2312 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.LogicalAnd, expr); } } void InclusiveOrExpr( -#line 2306 "cs.ATG" +#line 2315 "cs.ATG" ref Expression outExpr) { -#line 2307 "cs.ATG" +#line 2316 "cs.ATG" Expression expr; ExclusiveOrExpr( -#line 2309 "cs.ATG" +#line 2318 "cs.ATG" ref outExpr); while (la.kind == 29) { lexer.NextToken(); UnaryExpr( -#line 2309 "cs.ATG" +#line 2318 "cs.ATG" out expr); ExclusiveOrExpr( -#line 2309 "cs.ATG" +#line 2318 "cs.ATG" ref expr); -#line 2309 "cs.ATG" +#line 2318 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.BitwiseOr, expr); } } void ExclusiveOrExpr( -#line 2312 "cs.ATG" +#line 2321 "cs.ATG" ref Expression outExpr) { -#line 2313 "cs.ATG" +#line 2322 "cs.ATG" Expression expr; AndExpr( -#line 2315 "cs.ATG" +#line 2324 "cs.ATG" ref outExpr); while (la.kind == 30) { lexer.NextToken(); UnaryExpr( -#line 2315 "cs.ATG" +#line 2324 "cs.ATG" out expr); AndExpr( -#line 2315 "cs.ATG" +#line 2324 "cs.ATG" ref expr); -#line 2315 "cs.ATG" +#line 2324 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.ExclusiveOr, expr); } } void AndExpr( -#line 2318 "cs.ATG" +#line 2327 "cs.ATG" ref Expression outExpr) { -#line 2319 "cs.ATG" +#line 2328 "cs.ATG" Expression expr; EqualityExpr( -#line 2321 "cs.ATG" +#line 2330 "cs.ATG" ref outExpr); while (la.kind == 28) { lexer.NextToken(); UnaryExpr( -#line 2321 "cs.ATG" +#line 2330 "cs.ATG" out expr); EqualityExpr( -#line 2321 "cs.ATG" +#line 2330 "cs.ATG" ref expr); -#line 2321 "cs.ATG" +#line 2330 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.BitwiseAnd, expr); } } void EqualityExpr( -#line 2324 "cs.ATG" +#line 2333 "cs.ATG" ref Expression outExpr) { -#line 2326 "cs.ATG" +#line 2335 "cs.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; RelationalExpr( -#line 2330 "cs.ATG" +#line 2339 "cs.ATG" ref outExpr); while (la.kind == 33 || la.kind == 34) { if (la.kind == 34) { lexer.NextToken(); -#line 2333 "cs.ATG" +#line 2342 "cs.ATG" op = BinaryOperatorType.InEquality; } else { lexer.NextToken(); -#line 2334 "cs.ATG" +#line 2343 "cs.ATG" op = BinaryOperatorType.Equality; } UnaryExpr( -#line 2336 "cs.ATG" +#line 2345 "cs.ATG" out expr); RelationalExpr( -#line 2336 "cs.ATG" +#line 2345 "cs.ATG" ref expr); -#line 2336 "cs.ATG" +#line 2345 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void RelationalExpr( -#line 2340 "cs.ATG" +#line 2349 "cs.ATG" ref Expression outExpr) { -#line 2342 "cs.ATG" +#line 2351 "cs.ATG" TypeReference type; Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ShiftExpr( -#line 2347 "cs.ATG" +#line 2356 "cs.ATG" ref outExpr); while (StartOf(28)) { if (StartOf(29)) { if (la.kind == 23) { lexer.NextToken(); -#line 2349 "cs.ATG" +#line 2358 "cs.ATG" op = BinaryOperatorType.LessThan; } else if (la.kind == 22) { lexer.NextToken(); -#line 2350 "cs.ATG" +#line 2359 "cs.ATG" op = BinaryOperatorType.GreaterThan; } else if (la.kind == 36) { lexer.NextToken(); -#line 2351 "cs.ATG" +#line 2360 "cs.ATG" op = BinaryOperatorType.LessThanOrEqual; } else if (la.kind == 35) { lexer.NextToken(); -#line 2352 "cs.ATG" +#line 2361 "cs.ATG" op = BinaryOperatorType.GreaterThanOrEqual; } else SynErr(185); UnaryExpr( -#line 2354 "cs.ATG" +#line 2363 "cs.ATG" out expr); ShiftExpr( -#line 2355 "cs.ATG" +#line 2364 "cs.ATG" ref expr); -#line 2356 "cs.ATG" +#line 2365 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } else { if (la.kind == 84) { lexer.NextToken(); TypeWithRestriction( -#line 2359 "cs.ATG" +#line 2368 "cs.ATG" out type, false, false); if ( -#line 2360 "cs.ATG" +#line 2369 "cs.ATG" la.kind == Tokens.Question && Tokens.CastFollower[Peek(1).kind] == false) { NullableQuestionMark( -#line 2361 "cs.ATG" +#line 2370 "cs.ATG" ref type); } -#line 2362 "cs.ATG" +#line 2371 "cs.ATG" outExpr = new TypeOfIsExpression(outExpr, type); } else if (la.kind == 49) { lexer.NextToken(); TypeWithRestriction( -#line 2364 "cs.ATG" +#line 2373 "cs.ATG" out type, false, false); if ( -#line 2365 "cs.ATG" +#line 2374 "cs.ATG" la.kind == Tokens.Question && Tokens.CastFollower[Peek(1).kind] == false) { NullableQuestionMark( -#line 2366 "cs.ATG" +#line 2375 "cs.ATG" ref type); } -#line 2367 "cs.ATG" +#line 2376 "cs.ATG" outExpr = new CastExpression(type, outExpr, CastType.TryCast); } else SynErr(186); } @@ -5397,83 +5409,83 @@ ref type); } void ShiftExpr( -#line 2372 "cs.ATG" +#line 2381 "cs.ATG" ref Expression outExpr) { -#line 2374 "cs.ATG" +#line 2383 "cs.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; AdditiveExpr( -#line 2378 "cs.ATG" +#line 2387 "cs.ATG" ref outExpr); while (la.kind == 37 || -#line 2381 "cs.ATG" +#line 2390 "cs.ATG" IsShiftRight()) { if (la.kind == 37) { lexer.NextToken(); -#line 2380 "cs.ATG" +#line 2389 "cs.ATG" op = BinaryOperatorType.ShiftLeft; } else { Expect(22); Expect(22); -#line 2382 "cs.ATG" +#line 2391 "cs.ATG" op = BinaryOperatorType.ShiftRight; } UnaryExpr( -#line 2385 "cs.ATG" +#line 2394 "cs.ATG" out expr); AdditiveExpr( -#line 2385 "cs.ATG" +#line 2394 "cs.ATG" ref expr); -#line 2385 "cs.ATG" +#line 2394 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void AdditiveExpr( -#line 2389 "cs.ATG" +#line 2398 "cs.ATG" ref Expression outExpr) { -#line 2391 "cs.ATG" +#line 2400 "cs.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; MultiplicativeExpr( -#line 2395 "cs.ATG" +#line 2404 "cs.ATG" ref outExpr); while (la.kind == 4 || la.kind == 5) { if (la.kind == 4) { lexer.NextToken(); -#line 2398 "cs.ATG" +#line 2407 "cs.ATG" op = BinaryOperatorType.Add; } else { lexer.NextToken(); -#line 2399 "cs.ATG" +#line 2408 "cs.ATG" op = BinaryOperatorType.Subtract; } UnaryExpr( -#line 2401 "cs.ATG" +#line 2410 "cs.ATG" out expr); MultiplicativeExpr( -#line 2401 "cs.ATG" +#line 2410 "cs.ATG" ref expr); -#line 2401 "cs.ATG" +#line 2410 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void MultiplicativeExpr( -#line 2405 "cs.ATG" +#line 2414 "cs.ATG" ref Expression outExpr) { -#line 2407 "cs.ATG" +#line 2416 "cs.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; @@ -5481,57 +5493,57 @@ ref Expression outExpr) { if (la.kind == 6) { lexer.NextToken(); -#line 2413 "cs.ATG" +#line 2422 "cs.ATG" op = BinaryOperatorType.Multiply; } else if (la.kind == 7) { lexer.NextToken(); -#line 2414 "cs.ATG" +#line 2423 "cs.ATG" op = BinaryOperatorType.Divide; } else { lexer.NextToken(); -#line 2415 "cs.ATG" +#line 2424 "cs.ATG" op = BinaryOperatorType.Modulus; } UnaryExpr( -#line 2417 "cs.ATG" +#line 2426 "cs.ATG" out expr); -#line 2417 "cs.ATG" +#line 2426 "cs.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void TypeParameterConstraintsClauseBase( -#line 2521 "cs.ATG" +#line 2530 "cs.ATG" out TypeReference type) { -#line 2522 "cs.ATG" +#line 2531 "cs.ATG" TypeReference t; type = null; if (la.kind == 108) { lexer.NextToken(); -#line 2524 "cs.ATG" +#line 2533 "cs.ATG" type = new TypeReference("struct"); } else if (la.kind == 58) { lexer.NextToken(); -#line 2525 "cs.ATG" +#line 2534 "cs.ATG" type = new TypeReference("struct"); } else if (la.kind == 88) { lexer.NextToken(); Expect(20); Expect(21); -#line 2526 "cs.ATG" +#line 2535 "cs.ATG" type = new TypeReference("struct"); } else if (StartOf(9)) { Type( -#line 2527 "cs.ATG" +#line 2536 "cs.ATG" out t); -#line 2527 "cs.ATG" +#line 2536 "cs.ATG" type = t; } else SynErr(187); } diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG index c75e5d7666..3965a9f8f3 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG +++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG @@ -840,6 +840,7 @@ TypeDecl attributes> /* .NET 2.0 */ { IF (IdentIsWhere()) TypeParameterConstraintsClause } + (. newType.BodyStartLocation = t.EndLocation; .) ClassBody [ ";" ] (. newType.EndLocation = t.Location; compilationUnit.BlockEnd(); @@ -863,6 +864,7 @@ TypeDecl attributes> { IF (IdentIsWhere()) TypeParameterConstraintsClause } + (. newType.BodyStartLocation = t.EndLocation; .) StructBody [ ";" ] (. newType.EndLocation = t.Location; compilationUnit.BlockEnd(); @@ -885,6 +887,7 @@ TypeDecl attributes> /* .NET 2.0 */ { IF (IdentIsWhere()) TypeParameterConstraintsClause } + (. newType.BodyStartLocation = t.EndLocation; .) InterfaceBody [ ";" ] (. newType.EndLocation = t.Location; compilationUnit.BlockEnd(); @@ -899,6 +902,7 @@ TypeDecl attributes> ident (. newType.Name = t.val; .) [ ":" IntegralType (. newType.BaseTypes.Add(new TypeReference(name)); .) ] + (. newType.BodyStartLocation = t.EndLocation; .) EnumBody [ ";" ] (. newType.EndLocation = t.Location; compilationUnit.BlockEnd(); @@ -974,7 +978,7 @@ StructInterfaces names> StructBody (. AttributeSection section; .) = - "{" + "{" { (.List attributes = new List(); Modifiers m = new Modifiers(); .) @@ -996,12 +1000,17 @@ InterfaceBase names> . InterfaceBody -= "{" { InterfaceMemberDecl } "}" . += "{" + { InterfaceMemberDecl } + "}" +. EnumBody (. FieldDeclaration f; .) = - "{" [ EnumMemberDecl (. compilationUnit.AddChild(f); .) - { IF (NotFinalComma()) "," EnumMemberDecl (. compilationUnit.AddChild(f); .) + "{" + [ EnumMemberDecl (. compilationUnit.AddChild(f); .) + { IF (NotFinalComma()) "," + EnumMemberDecl (. compilationUnit.AddChild(f); .) } [","] ] "}" . diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs index a7c61f333b..9839ad27ba 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs @@ -401,7 +401,7 @@ out u); void GlobalAttributeSection() { -#line 2170 "VBNET.ATG" +#line 2177 "VBNET.ATG" Point startPos = t.Location; Expect(27); if (la.kind == 49) { @@ -410,20 +410,20 @@ out u); lexer.NextToken(); } else SynErr(208); -#line 2172 "VBNET.ATG" +#line 2179 "VBNET.ATG" string attributeTarget = t.val.ToLower(System.Globalization.CultureInfo.InvariantCulture); List attributes = new List(); ASTAttribute attribute; Expect(13); Attribute( -#line 2176 "VBNET.ATG" +#line 2183 "VBNET.ATG" out attribute); -#line 2176 "VBNET.ATG" +#line 2183 "VBNET.ATG" attributes.Add(attribute); while ( -#line 2177 "VBNET.ATG" +#line 2184 "VBNET.ATG" NotFinalComma()) { if (la.kind == 12) { lexer.NextToken(); @@ -435,10 +435,10 @@ NotFinalComma()) { Expect(13); } Attribute( -#line 2177 "VBNET.ATG" +#line 2184 "VBNET.ATG" out attribute); -#line 2177 "VBNET.ATG" +#line 2184 "VBNET.ATG" attributes.Add(attribute); } if (la.kind == 12) { @@ -447,7 +447,7 @@ out attribute); Expect(26); EndOfStmt(); -#line 2182 "VBNET.ATG" +#line 2189 "VBNET.ATG" AttributeSection section = new AttributeSection(attributeTarget, attributes); section.StartLocation = startPos; section.EndLocation = t.EndLocation; @@ -564,47 +564,47 @@ out aliasedType); } void Qualident( -#line 2898 "VBNET.ATG" +#line 2905 "VBNET.ATG" out string qualident) { -#line 2900 "VBNET.ATG" +#line 2907 "VBNET.ATG" string name; qualidentBuilder.Length = 0; Identifier(); -#line 2904 "VBNET.ATG" +#line 2911 "VBNET.ATG" qualidentBuilder.Append(t.val); while ( -#line 2905 "VBNET.ATG" +#line 2912 "VBNET.ATG" DotAndIdentOrKw()) { Expect(10); IdentifierOrKeyword( -#line 2905 "VBNET.ATG" +#line 2912 "VBNET.ATG" out name); -#line 2905 "VBNET.ATG" +#line 2912 "VBNET.ATG" qualidentBuilder.Append('.'); qualidentBuilder.Append(name); } -#line 2907 "VBNET.ATG" +#line 2914 "VBNET.ATG" qualident = qualidentBuilder.ToString(); } void TypeName( -#line 2063 "VBNET.ATG" +#line 2070 "VBNET.ATG" out TypeReference typeref) { -#line 2064 "VBNET.ATG" +#line 2071 "VBNET.ATG" ArrayList rank = null; NonArrayTypeName( -#line 2066 "VBNET.ATG" +#line 2073 "VBNET.ATG" out typeref, false); ArrayTypeModifiers( -#line 2067 "VBNET.ATG" +#line 2074 "VBNET.ATG" out rank); -#line 2068 "VBNET.ATG" +#line 2075 "VBNET.ATG" if (rank != null && typeref != null) { typeref.RankSpecifier = (int[])rank.ToArray(typeof(int)); } @@ -621,35 +621,35 @@ out rank); } void AttributeSection( -#line 2239 "VBNET.ATG" +#line 2246 "VBNET.ATG" out AttributeSection section) { -#line 2241 "VBNET.ATG" +#line 2248 "VBNET.ATG" string attributeTarget = "";List attributes = new List(); ASTAttribute attribute; Expect(27); -#line 2245 "VBNET.ATG" +#line 2252 "VBNET.ATG" Point startPos = t.Location; if ( -#line 2246 "VBNET.ATG" +#line 2253 "VBNET.ATG" IsLocalAttrTarget()) { if (la.kind == 93) { lexer.NextToken(); -#line 2247 "VBNET.ATG" +#line 2254 "VBNET.ATG" attributeTarget = "event"; } else if (la.kind == 154) { lexer.NextToken(); -#line 2248 "VBNET.ATG" +#line 2255 "VBNET.ATG" attributeTarget = "return"; } else { Identifier(); -#line 2251 "VBNET.ATG" +#line 2258 "VBNET.ATG" string val = t.val.ToLower(System.Globalization.CultureInfo.InvariantCulture); if (val != "field" || val != "method" || val != "module" || val != "param" || @@ -662,20 +662,20 @@ IsLocalAttrTarget()) { Expect(13); } Attribute( -#line 2261 "VBNET.ATG" +#line 2268 "VBNET.ATG" out attribute); -#line 2261 "VBNET.ATG" +#line 2268 "VBNET.ATG" attributes.Add(attribute); while ( -#line 2262 "VBNET.ATG" +#line 2269 "VBNET.ATG" NotFinalComma()) { Expect(12); Attribute( -#line 2262 "VBNET.ATG" +#line 2269 "VBNET.ATG" out attribute); -#line 2262 "VBNET.ATG" +#line 2269 "VBNET.ATG" attributes.Add(attribute); } if (la.kind == 12) { @@ -683,7 +683,7 @@ out attribute); } Expect(26); -#line 2266 "VBNET.ATG" +#line 2273 "VBNET.ATG" section = new AttributeSection(attributeTarget, attributes); section.StartLocation = startPos; section.EndLocation = t.EndLocation; @@ -691,69 +691,69 @@ out attribute); } void TypeModifier( -#line 2959 "VBNET.ATG" +#line 2966 "VBNET.ATG" Modifiers m) { switch (la.kind) { case 148: { lexer.NextToken(); -#line 2960 "VBNET.ATG" +#line 2967 "VBNET.ATG" m.Add(Modifier.Public, t.Location); break; } case 147: { lexer.NextToken(); -#line 2961 "VBNET.ATG" +#line 2968 "VBNET.ATG" m.Add(Modifier.Protected, t.Location); break; } case 99: { lexer.NextToken(); -#line 2962 "VBNET.ATG" +#line 2969 "VBNET.ATG" m.Add(Modifier.Internal, t.Location); break; } case 145: { lexer.NextToken(); -#line 2963 "VBNET.ATG" +#line 2970 "VBNET.ATG" m.Add(Modifier.Private, t.Location); break; } case 158: { lexer.NextToken(); -#line 2964 "VBNET.ATG" +#line 2971 "VBNET.ATG" m.Add(Modifier.Static, t.Location); break; } case 157: { lexer.NextToken(); -#line 2965 "VBNET.ATG" +#line 2972 "VBNET.ATG" m.Add(Modifier.New, t.Location); break; } case 122: { lexer.NextToken(); -#line 2966 "VBNET.ATG" +#line 2973 "VBNET.ATG" m.Add(Modifier.Abstract, t.Location); break; } case 131: { lexer.NextToken(); -#line 2967 "VBNET.ATG" +#line 2974 "VBNET.ATG" m.Add(Modifier.Sealed, t.Location); break; } case 203: { lexer.NextToken(); -#line 2968 "VBNET.ATG" +#line 2975 "VBNET.ATG" m.Add(Modifier.Partial, t.Location); break; } @@ -792,27 +792,30 @@ Modifiers m, List attributes) { #line 663 "VBNET.ATG" newType.Templates); EndOfStmt(); + +#line 665 "VBNET.ATG" + newType.BodyStartLocation = t.Location; if (la.kind == 110) { ClassBaseType( -#line 665 "VBNET.ATG" +#line 666 "VBNET.ATG" out typeRef); -#line 665 "VBNET.ATG" +#line 666 "VBNET.ATG" newType.BaseTypes.Add(typeRef); } while (la.kind == 107) { TypeImplementsClause( -#line 666 "VBNET.ATG" +#line 667 "VBNET.ATG" out baseInterfaces); -#line 666 "VBNET.ATG" +#line 667 "VBNET.ATG" newType.BaseTypes.AddRange(baseInterfaces); } ClassBody( -#line 667 "VBNET.ATG" +#line 668 "VBNET.ATG" newType); -#line 669 "VBNET.ATG" +#line 670 "VBNET.ATG" compilationUnit.BlockEnd(); break; @@ -820,7 +823,7 @@ newType); case 121: { lexer.NextToken(); -#line 673 "VBNET.ATG" +#line 674 "VBNET.ATG" m.Check(Modifier.VBModules); TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); compilationUnit.AddChild(newType); @@ -830,14 +833,17 @@ newType); Identifier(); -#line 680 "VBNET.ATG" +#line 681 "VBNET.ATG" newType.Name = t.val; Expect(1); + +#line 683 "VBNET.ATG" + newType.BodyStartLocation = t.Location; ModuleBody( -#line 682 "VBNET.ATG" +#line 684 "VBNET.ATG" newType); -#line 684 "VBNET.ATG" +#line 686 "VBNET.ATG" compilationUnit.BlockEnd(); break; @@ -845,7 +851,7 @@ newType); case 166: { lexer.NextToken(); -#line 688 "VBNET.ATG" +#line 690 "VBNET.ATG" m.Check(Modifier.VBStructures); TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); compilationUnit.AddChild(newType); @@ -855,25 +861,28 @@ newType); Identifier(); -#line 695 "VBNET.ATG" +#line 697 "VBNET.ATG" newType.Name = t.val; TypeParameterList( -#line 696 "VBNET.ATG" +#line 698 "VBNET.ATG" newType.Templates); Expect(1); + +#line 700 "VBNET.ATG" + newType.BodyStartLocation = t.Location; while (la.kind == 107) { TypeImplementsClause( -#line 697 "VBNET.ATG" +#line 701 "VBNET.ATG" out baseInterfaces); -#line 697 "VBNET.ATG" +#line 701 "VBNET.ATG" newType.BaseTypes.AddRange(baseInterfaces); } StructureBody( -#line 698 "VBNET.ATG" +#line 702 "VBNET.ATG" newType); -#line 700 "VBNET.ATG" +#line 704 "VBNET.ATG" compilationUnit.BlockEnd(); break; @@ -881,7 +890,7 @@ newType); case 90: { lexer.NextToken(); -#line 705 "VBNET.ATG" +#line 709 "VBNET.ATG" m.Check(Modifier.VBEnums); TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); newType.StartLocation = m.GetDeclarationLocation(t.Location); @@ -892,23 +901,26 @@ newType); Identifier(); -#line 713 "VBNET.ATG" +#line 717 "VBNET.ATG" newType.Name = t.val; if (la.kind == 48) { lexer.NextToken(); NonArrayTypeName( -#line 714 "VBNET.ATG" +#line 718 "VBNET.ATG" out typeRef, false); -#line 714 "VBNET.ATG" +#line 718 "VBNET.ATG" newType.BaseTypes.Add(typeRef); } Expect(1); + +#line 720 "VBNET.ATG" + newType.BodyStartLocation = t.Location; EnumBody( -#line 716 "VBNET.ATG" +#line 721 "VBNET.ATG" newType); -#line 718 "VBNET.ATG" +#line 723 "VBNET.ATG" compilationUnit.BlockEnd(); break; @@ -916,7 +928,7 @@ newType); case 112: { lexer.NextToken(); -#line 723 "VBNET.ATG" +#line 728 "VBNET.ATG" m.Check(Modifier.VBInterfacs); TypeDeclaration newType = new TypeDeclaration(m.Modifier, attributes); newType.StartLocation = m.GetDeclarationLocation(t.Location); @@ -926,25 +938,28 @@ newType); Identifier(); -#line 730 "VBNET.ATG" +#line 735 "VBNET.ATG" newType.Name = t.val; TypeParameterList( -#line 731 "VBNET.ATG" +#line 736 "VBNET.ATG" newType.Templates); EndOfStmt(); + +#line 738 "VBNET.ATG" + newType.BodyStartLocation = t.Location; while (la.kind == 110) { InterfaceBase( -#line 732 "VBNET.ATG" +#line 739 "VBNET.ATG" out baseInterfaces); -#line 732 "VBNET.ATG" +#line 739 "VBNET.ATG" newType.BaseTypes.AddRange(baseInterfaces); } InterfaceBody( -#line 733 "VBNET.ATG" +#line 740 "VBNET.ATG" newType); -#line 735 "VBNET.ATG" +#line 742 "VBNET.ATG" compilationUnit.BlockEnd(); break; @@ -952,7 +967,7 @@ newType); case 80: { lexer.NextToken(); -#line 740 "VBNET.ATG" +#line 747 "VBNET.ATG" m.Check(Modifier.VBDelegates); DelegateDeclaration delegateDeclr = new DelegateDeclaration(m.Modifier, attributes); delegateDeclr.ReturnType = new TypeReference("", "System.Void"); @@ -963,63 +978,63 @@ newType); lexer.NextToken(); Identifier(); -#line 747 "VBNET.ATG" +#line 754 "VBNET.ATG" delegateDeclr.Name = t.val; TypeParameterList( -#line 748 "VBNET.ATG" +#line 755 "VBNET.ATG" delegateDeclr.Templates); if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 749 "VBNET.ATG" +#line 756 "VBNET.ATG" p); } Expect(25); -#line 749 "VBNET.ATG" +#line 756 "VBNET.ATG" delegateDeclr.Parameters = p; } } else if (la.kind == 100) { lexer.NextToken(); Identifier(); -#line 751 "VBNET.ATG" +#line 758 "VBNET.ATG" delegateDeclr.Name = t.val; TypeParameterList( -#line 752 "VBNET.ATG" +#line 759 "VBNET.ATG" delegateDeclr.Templates); if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 753 "VBNET.ATG" +#line 760 "VBNET.ATG" p); } Expect(25); -#line 753 "VBNET.ATG" +#line 760 "VBNET.ATG" delegateDeclr.Parameters = p; } if (la.kind == 48) { lexer.NextToken(); -#line 754 "VBNET.ATG" +#line 761 "VBNET.ATG" TypeReference type; TypeName( -#line 754 "VBNET.ATG" +#line 761 "VBNET.ATG" out type); -#line 754 "VBNET.ATG" +#line 761 "VBNET.ATG" delegateDeclr.ReturnType = type; } } else SynErr(214); -#line 756 "VBNET.ATG" +#line 763 "VBNET.ATG" delegateDeclr.EndLocation = t.EndLocation; Expect(1); -#line 759 "VBNET.ATG" +#line 766 "VBNET.ATG" compilationUnit.AddChild(delegateDeclr); break; @@ -1158,163 +1173,163 @@ out constraint); } void ClassBaseType( -#line 936 "VBNET.ATG" +#line 943 "VBNET.ATG" out TypeReference typeRef) { -#line 938 "VBNET.ATG" +#line 945 "VBNET.ATG" typeRef = null; Expect(110); TypeName( -#line 941 "VBNET.ATG" +#line 948 "VBNET.ATG" out typeRef); EndOfStmt(); } void TypeImplementsClause( -#line 1673 "VBNET.ATG" +#line 1680 "VBNET.ATG" out List baseInterfaces) { -#line 1675 "VBNET.ATG" +#line 1682 "VBNET.ATG" baseInterfaces = new List(); TypeReference type = null; Expect(107); TypeName( -#line 1678 "VBNET.ATG" +#line 1685 "VBNET.ATG" out type); -#line 1680 "VBNET.ATG" +#line 1687 "VBNET.ATG" baseInterfaces.Add(type); while (la.kind == 12) { lexer.NextToken(); TypeName( -#line 1683 "VBNET.ATG" +#line 1690 "VBNET.ATG" out type); -#line 1684 "VBNET.ATG" +#line 1691 "VBNET.ATG" baseInterfaces.Add(type); } EndOfStmt(); } void ClassBody( -#line 769 "VBNET.ATG" +#line 776 "VBNET.ATG" TypeDeclaration newType) { -#line 770 "VBNET.ATG" +#line 777 "VBNET.ATG" AttributeSection section; while (StartOf(6)) { -#line 772 "VBNET.ATG" +#line 779 "VBNET.ATG" List attributes = new List(); Modifiers m = new Modifiers(); while (la.kind == 27) { AttributeSection( -#line 775 "VBNET.ATG" +#line 782 "VBNET.ATG" out section); -#line 775 "VBNET.ATG" +#line 782 "VBNET.ATG" attributes.Add(section); } while (StartOf(7)) { MemberModifier( -#line 776 "VBNET.ATG" +#line 783 "VBNET.ATG" m); } ClassMemberDecl( -#line 777 "VBNET.ATG" +#line 784 "VBNET.ATG" m, attributes); } Expect(88); Expect(67); -#line 779 "VBNET.ATG" +#line 786 "VBNET.ATG" newType.EndLocation = t.EndLocation; Expect(1); } void ModuleBody( -#line 798 "VBNET.ATG" +#line 805 "VBNET.ATG" TypeDeclaration newType) { -#line 799 "VBNET.ATG" +#line 806 "VBNET.ATG" AttributeSection section; while (StartOf(6)) { -#line 801 "VBNET.ATG" +#line 808 "VBNET.ATG" List attributes = new List(); Modifiers m = new Modifiers(); while (la.kind == 27) { AttributeSection( -#line 804 "VBNET.ATG" +#line 811 "VBNET.ATG" out section); -#line 804 "VBNET.ATG" +#line 811 "VBNET.ATG" attributes.Add(section); } while (StartOf(7)) { MemberModifier( -#line 805 "VBNET.ATG" +#line 812 "VBNET.ATG" m); } ClassMemberDecl( -#line 806 "VBNET.ATG" +#line 813 "VBNET.ATG" m, attributes); } Expect(88); Expect(121); -#line 808 "VBNET.ATG" +#line 815 "VBNET.ATG" newType.EndLocation = t.EndLocation; Expect(1); } void StructureBody( -#line 783 "VBNET.ATG" +#line 790 "VBNET.ATG" TypeDeclaration newType) { -#line 784 "VBNET.ATG" +#line 791 "VBNET.ATG" AttributeSection section; while (StartOf(6)) { -#line 786 "VBNET.ATG" +#line 793 "VBNET.ATG" List attributes = new List(); Modifiers m = new Modifiers(); while (la.kind == 27) { AttributeSection( -#line 789 "VBNET.ATG" +#line 796 "VBNET.ATG" out section); -#line 789 "VBNET.ATG" +#line 796 "VBNET.ATG" attributes.Add(section); } while (StartOf(7)) { MemberModifier( -#line 790 "VBNET.ATG" +#line 797 "VBNET.ATG" m); } StructureMemberDecl( -#line 791 "VBNET.ATG" +#line 798 "VBNET.ATG" m, attributes); } Expect(88); Expect(166); -#line 793 "VBNET.ATG" +#line 800 "VBNET.ATG" newType.EndLocation = t.EndLocation; Expect(1); } void NonArrayTypeName( -#line 2086 "VBNET.ATG" +#line 2093 "VBNET.ATG" out TypeReference typeref, bool canBeUnbound) { -#line 2088 "VBNET.ATG" +#line 2095 "VBNET.ATG" string name; typeref = null; bool isGlobal = false; @@ -1324,93 +1339,93 @@ out TypeReference typeref, bool canBeUnbound) { lexer.NextToken(); Expect(10); -#line 2093 "VBNET.ATG" +#line 2100 "VBNET.ATG" isGlobal = true; } QualIdentAndTypeArguments( -#line 2094 "VBNET.ATG" +#line 2101 "VBNET.ATG" out typeref, canBeUnbound); -#line 2095 "VBNET.ATG" +#line 2102 "VBNET.ATG" typeref.IsGlobal = isGlobal; while (la.kind == 10) { lexer.NextToken(); -#line 2096 "VBNET.ATG" +#line 2103 "VBNET.ATG" TypeReference nestedTypeRef; QualIdentAndTypeArguments( -#line 2097 "VBNET.ATG" +#line 2104 "VBNET.ATG" out nestedTypeRef, canBeUnbound); -#line 2098 "VBNET.ATG" +#line 2105 "VBNET.ATG" typeref = new InnerClassTypeReference(typeref, nestedTypeRef.Type, nestedTypeRef.GenericTypes); } } else if (la.kind == 133) { lexer.NextToken(); -#line 2101 "VBNET.ATG" +#line 2108 "VBNET.ATG" typeref = new TypeReference("System.Object"); } else if (StartOf(9)) { PrimitiveTypeName( -#line 2102 "VBNET.ATG" +#line 2109 "VBNET.ATG" out name); -#line 2102 "VBNET.ATG" +#line 2109 "VBNET.ATG" typeref = new TypeReference(name); } else SynErr(218); } void EnumBody( -#line 812 "VBNET.ATG" +#line 819 "VBNET.ATG" TypeDeclaration newType) { -#line 813 "VBNET.ATG" +#line 820 "VBNET.ATG" FieldDeclaration f; while (StartOf(10)) { EnumMemberDecl( -#line 815 "VBNET.ATG" +#line 822 "VBNET.ATG" out f); -#line 815 "VBNET.ATG" +#line 822 "VBNET.ATG" compilationUnit.AddChild(f); } Expect(88); Expect(90); -#line 817 "VBNET.ATG" +#line 824 "VBNET.ATG" newType.EndLocation = t.EndLocation; Expect(1); } void InterfaceBase( -#line 1658 "VBNET.ATG" +#line 1665 "VBNET.ATG" out List bases) { -#line 1660 "VBNET.ATG" +#line 1667 "VBNET.ATG" TypeReference type; bases = new List(); Expect(110); TypeName( -#line 1664 "VBNET.ATG" +#line 1671 "VBNET.ATG" out type); -#line 1664 "VBNET.ATG" +#line 1671 "VBNET.ATG" bases.Add(type); while (la.kind == 12) { lexer.NextToken(); TypeName( -#line 1667 "VBNET.ATG" +#line 1674 "VBNET.ATG" out type); -#line 1667 "VBNET.ATG" +#line 1674 "VBNET.ATG" bases.Add(type); } Expect(1); } void InterfaceBody( -#line 821 "VBNET.ATG" +#line 828 "VBNET.ATG" TypeDeclaration newType) { while (StartOf(11)) { InterfaceMemberDecl(); @@ -1418,33 +1433,33 @@ TypeDeclaration newType) { Expect(88); Expect(112); -#line 823 "VBNET.ATG" +#line 830 "VBNET.ATG" newType.EndLocation = t.EndLocation; Expect(1); } void FormalParameterList( -#line 2273 "VBNET.ATG" +#line 2280 "VBNET.ATG" List parameter) { -#line 2275 "VBNET.ATG" +#line 2282 "VBNET.ATG" ParameterDeclarationExpression p; AttributeSection section; List attributes = new List(); while (la.kind == 27) { AttributeSection( -#line 2279 "VBNET.ATG" +#line 2286 "VBNET.ATG" out section); -#line 2279 "VBNET.ATG" +#line 2286 "VBNET.ATG" attributes.Add(section); } FormalParameter( -#line 2281 "VBNET.ATG" +#line 2288 "VBNET.ATG" out p); -#line 2283 "VBNET.ATG" +#line 2290 "VBNET.ATG" bool paramsFound = false; p.Attributes = attributes; parameter.Add(p); @@ -1452,166 +1467,166 @@ out p); while (la.kind == 12) { lexer.NextToken(); -#line 2288 "VBNET.ATG" +#line 2295 "VBNET.ATG" if (paramsFound) Error("params array must be at end of parameter list"); while (la.kind == 27) { AttributeSection( -#line 2289 "VBNET.ATG" +#line 2296 "VBNET.ATG" out section); -#line 2289 "VBNET.ATG" +#line 2296 "VBNET.ATG" attributes.Add(section); } FormalParameter( -#line 2291 "VBNET.ATG" +#line 2298 "VBNET.ATG" out p); -#line 2291 "VBNET.ATG" +#line 2298 "VBNET.ATG" p.Attributes = attributes; parameter.Add(p); } } void MemberModifier( -#line 2971 "VBNET.ATG" +#line 2978 "VBNET.ATG" Modifiers m) { switch (la.kind) { case 122: { lexer.NextToken(); -#line 2972 "VBNET.ATG" +#line 2979 "VBNET.ATG" m.Add(Modifier.Abstract, t.Location); break; } case 79: { lexer.NextToken(); -#line 2973 "VBNET.ATG" +#line 2980 "VBNET.ATG" m.Add(Modifier.Default, t.Location); break; } case 99: { lexer.NextToken(); -#line 2974 "VBNET.ATG" +#line 2981 "VBNET.ATG" m.Add(Modifier.Internal, t.Location); break; } case 157: { lexer.NextToken(); -#line 2975 "VBNET.ATG" +#line 2982 "VBNET.ATG" m.Add(Modifier.New, t.Location); break; } case 142: { lexer.NextToken(); -#line 2976 "VBNET.ATG" +#line 2983 "VBNET.ATG" m.Add(Modifier.Override, t.Location); break; } case 123: { lexer.NextToken(); -#line 2977 "VBNET.ATG" +#line 2984 "VBNET.ATG" m.Add(Modifier.Abstract, t.Location); break; } case 145: { lexer.NextToken(); -#line 2978 "VBNET.ATG" +#line 2985 "VBNET.ATG" m.Add(Modifier.Private, t.Location); break; } case 147: { lexer.NextToken(); -#line 2979 "VBNET.ATG" +#line 2986 "VBNET.ATG" m.Add(Modifier.Protected, t.Location); break; } case 148: { lexer.NextToken(); -#line 2980 "VBNET.ATG" +#line 2987 "VBNET.ATG" m.Add(Modifier.Public, t.Location); break; } case 131: { lexer.NextToken(); -#line 2981 "VBNET.ATG" +#line 2988 "VBNET.ATG" m.Add(Modifier.Sealed, t.Location); break; } case 132: { lexer.NextToken(); -#line 2982 "VBNET.ATG" +#line 2989 "VBNET.ATG" m.Add(Modifier.Sealed, t.Location); break; } case 158: { lexer.NextToken(); -#line 2983 "VBNET.ATG" +#line 2990 "VBNET.ATG" m.Add(Modifier.Static, t.Location); break; } case 141: { lexer.NextToken(); -#line 2984 "VBNET.ATG" +#line 2991 "VBNET.ATG" m.Add(Modifier.Virtual, t.Location); break; } case 140: { lexer.NextToken(); -#line 2985 "VBNET.ATG" +#line 2992 "VBNET.ATG" m.Add(Modifier.Overloads, t.Location); break; } case 150: { lexer.NextToken(); -#line 2986 "VBNET.ATG" +#line 2993 "VBNET.ATG" m.Add(Modifier.ReadOnly, t.Location); break; } case 184: { lexer.NextToken(); -#line 2987 "VBNET.ATG" +#line 2994 "VBNET.ATG" m.Add(Modifier.WriteOnly, t.Location); break; } case 183: { lexer.NextToken(); -#line 2988 "VBNET.ATG" +#line 2995 "VBNET.ATG" m.Add(Modifier.WithEvents, t.Location); break; } case 81: { lexer.NextToken(); -#line 2989 "VBNET.ATG" +#line 2996 "VBNET.ATG" m.Add(Modifier.Dim, t.Location); break; } case 202: { lexer.NextToken(); -#line 2990 "VBNET.ATG" +#line 2997 "VBNET.ATG" m.Add(Modifier.Widening, t.Location); break; } case 201: { lexer.NextToken(); -#line 2991 "VBNET.ATG" +#line 2998 "VBNET.ATG" m.Add(Modifier.Narrowing, t.Location); break; } @@ -1620,18 +1635,18 @@ Modifiers m) { } void ClassMemberDecl( -#line 932 "VBNET.ATG" +#line 939 "VBNET.ATG" Modifiers m, List attributes) { StructureMemberDecl( -#line 933 "VBNET.ATG" +#line 940 "VBNET.ATG" m, attributes); } void StructureMemberDecl( -#line 946 "VBNET.ATG" +#line 953 "VBNET.ATG" Modifiers m, List attributes) { -#line 948 "VBNET.ATG" +#line 955 "VBNET.ATG" TypeReference type = null; List p = new List(); Statement stmt = null; @@ -1641,37 +1656,37 @@ Modifiers m, List attributes) { switch (la.kind) { case 67: case 80: case 90: case 112: case 121: case 166: { NonModuleDeclaration( -#line 954 "VBNET.ATG" +#line 961 "VBNET.ATG" m, attributes); break; } case 167: { lexer.NextToken(); -#line 958 "VBNET.ATG" +#line 965 "VBNET.ATG" Point startPos = t.Location; if (StartOf(12)) { -#line 962 "VBNET.ATG" +#line 969 "VBNET.ATG" string name = String.Empty; MethodDeclaration methodDeclaration; List handlesClause = null; List implementsClause = null; Identifier(); -#line 968 "VBNET.ATG" +#line 975 "VBNET.ATG" name = t.val; m.Check(Modifier.VBMethods); TypeParameterList( -#line 971 "VBNET.ATG" +#line 978 "VBNET.ATG" templates); if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 972 "VBNET.ATG" +#line 979 "VBNET.ATG" p); } Expect(25); @@ -1679,23 +1694,23 @@ p); if (la.kind == 105 || la.kind == 107) { if (la.kind == 107) { ImplementsClause( -#line 975 "VBNET.ATG" +#line 982 "VBNET.ATG" out implementsClause); } else { HandlesClause( -#line 977 "VBNET.ATG" +#line 984 "VBNET.ATG" out handlesClause); } } -#line 980 "VBNET.ATG" +#line 987 "VBNET.ATG" Point endLocation = t.EndLocation; Expect(1); if ( -#line 984 "VBNET.ATG" +#line 991 "VBNET.ATG" IsMustOverride(m)) { -#line 986 "VBNET.ATG" +#line 993 "VBNET.ATG" methodDeclaration = new MethodDeclaration(name, m.Modifier, null, p, attributes); methodDeclaration.StartLocation = m.GetDeclarationLocation(startPos); methodDeclaration.EndLocation = endLocation; @@ -1709,7 +1724,7 @@ IsMustOverride(m)) { } else if (StartOf(13)) { -#line 999 "VBNET.ATG" +#line 1006 "VBNET.ATG" methodDeclaration = new MethodDeclaration(name, m.Modifier, null, p, attributes); methodDeclaration.StartLocation = m.GetDeclarationLocation(startPos); methodDeclaration.EndLocation = endLocation; @@ -1723,17 +1738,17 @@ IsMustOverride(m)) { compilationUnit.BlockStart(methodDeclaration); Block( -#line 1011 "VBNET.ATG" +#line 1018 "VBNET.ATG" out stmt); -#line 1013 "VBNET.ATG" +#line 1020 "VBNET.ATG" compilationUnit.BlockEnd(); methodDeclaration.Body = (BlockStatement)stmt; Expect(88); Expect(167); -#line 1016 "VBNET.ATG" +#line 1023 "VBNET.ATG" methodDeclaration.Body.EndLocation = t.EndLocation; Expect(1); } else SynErr(220); @@ -1743,29 +1758,29 @@ out stmt); lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 1019 "VBNET.ATG" +#line 1026 "VBNET.ATG" p); } Expect(25); } -#line 1020 "VBNET.ATG" +#line 1027 "VBNET.ATG" m.Check(Modifier.Constructors); -#line 1021 "VBNET.ATG" +#line 1028 "VBNET.ATG" Point constructorEndLocation = t.EndLocation; Expect(1); Block( -#line 1023 "VBNET.ATG" +#line 1030 "VBNET.ATG" out stmt); Expect(88); Expect(167); -#line 1024 "VBNET.ATG" +#line 1031 "VBNET.ATG" Point endLocation = t.EndLocation; Expect(1); -#line 1026 "VBNET.ATG" +#line 1033 "VBNET.ATG" ConstructorDeclaration cd = new ConstructorDeclaration("New", m.Modifier, p, attributes); cd.StartLocation = m.GetDeclarationLocation(startPos); cd.EndLocation = constructorEndLocation; @@ -1779,7 +1794,7 @@ out stmt); case 100: { lexer.NextToken(); -#line 1038 "VBNET.ATG" +#line 1045 "VBNET.ATG" m.Check(Modifier.VBMethods); string name = String.Empty; Point startPos = t.Location; @@ -1789,16 +1804,16 @@ out stmt); Identifier(); -#line 1045 "VBNET.ATG" +#line 1052 "VBNET.ATG" name = t.val; TypeParameterList( -#line 1046 "VBNET.ATG" +#line 1053 "VBNET.ATG" templates); if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 1047 "VBNET.ATG" +#line 1054 "VBNET.ATG" p); } Expect(25); @@ -1807,15 +1822,15 @@ p); lexer.NextToken(); while (la.kind == 27) { AttributeSection( -#line 1048 "VBNET.ATG" +#line 1055 "VBNET.ATG" out returnTypeAttributeSection); } TypeName( -#line 1048 "VBNET.ATG" +#line 1055 "VBNET.ATG" out type); } -#line 1050 "VBNET.ATG" +#line 1057 "VBNET.ATG" if(type == null) { type = new TypeReference("System.Object"); } @@ -1823,20 +1838,20 @@ out type); if (la.kind == 105 || la.kind == 107) { if (la.kind == 107) { ImplementsClause( -#line 1056 "VBNET.ATG" +#line 1063 "VBNET.ATG" out implementsClause); } else { HandlesClause( -#line 1058 "VBNET.ATG" +#line 1065 "VBNET.ATG" out handlesClause); } } Expect(1); if ( -#line 1064 "VBNET.ATG" +#line 1071 "VBNET.ATG" IsMustOverride(m)) { -#line 1066 "VBNET.ATG" +#line 1073 "VBNET.ATG" methodDeclaration = new MethodDeclaration(name, m.Modifier, type, p, attributes); methodDeclaration.StartLocation = m.GetDeclarationLocation(startPos); methodDeclaration.EndLocation = t.EndLocation; @@ -1852,7 +1867,7 @@ IsMustOverride(m)) { } else if (StartOf(13)) { -#line 1081 "VBNET.ATG" +#line 1088 "VBNET.ATG" methodDeclaration = new MethodDeclaration(name, m.Modifier, type, p, attributes); methodDeclaration.StartLocation = m.GetDeclarationLocation(startPos); methodDeclaration.EndLocation = t.EndLocation; @@ -1869,17 +1884,17 @@ IsMustOverride(m)) { compilationUnit.BlockStart(methodDeclaration); Block( -#line 1096 "VBNET.ATG" +#line 1103 "VBNET.ATG" out stmt); -#line 1098 "VBNET.ATG" +#line 1105 "VBNET.ATG" compilationUnit.BlockEnd(); methodDeclaration.Body = (BlockStatement)stmt; Expect(88); Expect(100); -#line 1103 "VBNET.ATG" +#line 1110 "VBNET.ATG" methodDeclaration.Body.StartLocation = methodDeclaration.EndLocation; methodDeclaration.Body.EndLocation = t.EndLocation; @@ -1890,7 +1905,7 @@ out stmt); case 78: { lexer.NextToken(); -#line 1112 "VBNET.ATG" +#line 1119 "VBNET.ATG" m.Check(Modifier.VBExternalMethods); Point startPos = t.Location; CharsetModifier charsetModifer = CharsetModifier.None; @@ -1900,39 +1915,39 @@ out stmt); if (StartOf(14)) { Charset( -#line 1119 "VBNET.ATG" +#line 1126 "VBNET.ATG" out charsetModifer); } if (la.kind == 167) { lexer.NextToken(); Identifier(); -#line 1122 "VBNET.ATG" +#line 1129 "VBNET.ATG" name = t.val; Expect(115); Expect(3); -#line 1123 "VBNET.ATG" +#line 1130 "VBNET.ATG" library = t.literalValue.ToString(); if (la.kind == 44) { lexer.NextToken(); Expect(3); -#line 1124 "VBNET.ATG" +#line 1131 "VBNET.ATG" alias = t.literalValue.ToString(); } if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 1125 "VBNET.ATG" +#line 1132 "VBNET.ATG" p); } Expect(25); } Expect(1); -#line 1128 "VBNET.ATG" +#line 1135 "VBNET.ATG" DeclareDeclaration declareDeclaration = new DeclareDeclaration(name, m.Modifier, null, p, attributes, library, alias, charsetModifer); declareDeclaration.StartLocation = m.GetDeclarationLocation(startPos); declareDeclaration.EndLocation = t.EndLocation; @@ -1942,25 +1957,25 @@ p); lexer.NextToken(); Identifier(); -#line 1135 "VBNET.ATG" +#line 1142 "VBNET.ATG" name = t.val; Expect(115); Expect(3); -#line 1136 "VBNET.ATG" +#line 1143 "VBNET.ATG" library = t.literalValue.ToString(); if (la.kind == 44) { lexer.NextToken(); Expect(3); -#line 1137 "VBNET.ATG" +#line 1144 "VBNET.ATG" alias = t.literalValue.ToString(); } if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 1138 "VBNET.ATG" +#line 1145 "VBNET.ATG" p); } Expect(25); @@ -1968,12 +1983,12 @@ p); if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 1139 "VBNET.ATG" +#line 1146 "VBNET.ATG" out type); } Expect(1); -#line 1142 "VBNET.ATG" +#line 1149 "VBNET.ATG" DeclareDeclaration declareDeclaration = new DeclareDeclaration(name, m.Modifier, type, p, attributes, library, alias, charsetModifer); declareDeclaration.StartLocation = m.GetDeclarationLocation(startPos); declareDeclaration.EndLocation = t.EndLocation; @@ -1985,7 +2000,7 @@ out type); case 93: { lexer.NextToken(); -#line 1152 "VBNET.ATG" +#line 1159 "VBNET.ATG" m.Check(Modifier.VBEvents); Point startPos = t.Location; EventDeclaration eventDeclaration; @@ -1994,19 +2009,19 @@ out type); Identifier(); -#line 1158 "VBNET.ATG" +#line 1165 "VBNET.ATG" name= t.val; if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 1160 "VBNET.ATG" +#line 1167 "VBNET.ATG" out type); } else if (la.kind == 1 || la.kind == 24 || la.kind == 107) { if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 1162 "VBNET.ATG" +#line 1169 "VBNET.ATG" p); } Expect(25); @@ -2014,11 +2029,11 @@ p); } else SynErr(224); if (la.kind == 107) { ImplementsClause( -#line 1164 "VBNET.ATG" +#line 1171 "VBNET.ATG" out implementsClause); } -#line 1166 "VBNET.ATG" +#line 1173 "VBNET.ATG" eventDeclaration = new EventDeclaration(type, m.Modifier, p, attributes, name, implementsClause); eventDeclaration.StartLocation = m.GetDeclarationLocation(startPos); eventDeclaration.EndLocation = t.EndLocation; @@ -2029,26 +2044,26 @@ out implementsClause); } case 2: case 47: case 49: case 50: case 51: case 70: case 144: case 169: case 176: case 177: { -#line 1173 "VBNET.ATG" +#line 1180 "VBNET.ATG" Point startPos = t.Location; -#line 1175 "VBNET.ATG" +#line 1182 "VBNET.ATG" m.Check(Modifier.Fields); FieldDeclaration fd = new FieldDeclaration(attributes, type, m.Modifier); fd.StartLocation = m.GetDeclarationLocation(startPos); VariableDeclarator( -#line 1179 "VBNET.ATG" +#line 1186 "VBNET.ATG" variableDeclarators); while (la.kind == 12) { lexer.NextToken(); VariableDeclarator( -#line 1180 "VBNET.ATG" +#line 1187 "VBNET.ATG" variableDeclarators); } Expect(1); -#line 1183 "VBNET.ATG" +#line 1190 "VBNET.ATG" fd.EndLocation = t.EndLocation; fd.Fields = variableDeclarators; compilationUnit.AddChild(fd); @@ -2057,35 +2072,35 @@ variableDeclarators); } case 71: { -#line 1188 "VBNET.ATG" +#line 1195 "VBNET.ATG" m.Check(Modifier.Fields); lexer.NextToken(); -#line 1189 "VBNET.ATG" +#line 1196 "VBNET.ATG" m.Add(Modifier.Const, t.Location); -#line 1191 "VBNET.ATG" +#line 1198 "VBNET.ATG" FieldDeclaration fd = new FieldDeclaration(attributes, type, m.Modifier); fd.StartLocation = m.GetDeclarationLocation(t.Location); List constantDeclarators = new List(); ConstantDeclarator( -#line 1195 "VBNET.ATG" +#line 1202 "VBNET.ATG" constantDeclarators); while (la.kind == 12) { lexer.NextToken(); ConstantDeclarator( -#line 1196 "VBNET.ATG" +#line 1203 "VBNET.ATG" constantDeclarators); } -#line 1198 "VBNET.ATG" +#line 1205 "VBNET.ATG" fd.Fields = constantDeclarators; fd.EndLocation = t.Location; Expect(1); -#line 1203 "VBNET.ATG" +#line 1210 "VBNET.ATG" fd.EndLocation = t.EndLocation; compilationUnit.AddChild(fd); @@ -2094,20 +2109,20 @@ constantDeclarators); case 146: { lexer.NextToken(); -#line 1209 "VBNET.ATG" +#line 1216 "VBNET.ATG" m.Check(Modifier.VBProperties); Point startPos = t.Location; List implementsClause = null; Identifier(); -#line 1213 "VBNET.ATG" +#line 1220 "VBNET.ATG" string propertyName = t.val; if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 1214 "VBNET.ATG" +#line 1221 "VBNET.ATG" p); } Expect(25); @@ -2115,26 +2130,26 @@ p); if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 1215 "VBNET.ATG" +#line 1222 "VBNET.ATG" out type); } -#line 1217 "VBNET.ATG" +#line 1224 "VBNET.ATG" if(type == null) { type = new TypeReference("System.Object"); } if (la.kind == 107) { ImplementsClause( -#line 1221 "VBNET.ATG" +#line 1228 "VBNET.ATG" out implementsClause); } Expect(1); if ( -#line 1225 "VBNET.ATG" +#line 1232 "VBNET.ATG" IsMustOverride(m)) { -#line 1227 "VBNET.ATG" +#line 1234 "VBNET.ATG" PropertyDeclaration pDecl = new PropertyDeclaration(propertyName, type, m.Modifier, attributes); pDecl.StartLocation = m.GetDeclarationLocation(startPos); pDecl.EndLocation = t.Location; @@ -2145,7 +2160,7 @@ IsMustOverride(m)) { } else if (la.kind == 27 || la.kind == 101 || la.kind == 156) { -#line 1237 "VBNET.ATG" +#line 1244 "VBNET.ATG" PropertyDeclaration pDecl = new PropertyDeclaration(propertyName, type, m.Modifier, attributes); pDecl.StartLocation = m.GetDeclarationLocation(startPos); pDecl.EndLocation = t.Location; @@ -2157,13 +2172,13 @@ IsMustOverride(m)) { PropertySetRegion setRegion; AccessorDecls( -#line 1247 "VBNET.ATG" +#line 1254 "VBNET.ATG" out getRegion, out setRegion); Expect(88); Expect(146); Expect(1); -#line 1251 "VBNET.ATG" +#line 1258 "VBNET.ATG" pDecl.GetRegion = getRegion; pDecl.SetRegion = setRegion; pDecl.BodyEnd = t.EndLocation; @@ -2175,11 +2190,11 @@ out getRegion, out setRegion); case 204: { lexer.NextToken(); -#line 1258 "VBNET.ATG" +#line 1265 "VBNET.ATG" Point startPos = t.Location; Expect(93); -#line 1260 "VBNET.ATG" +#line 1267 "VBNET.ATG" m.Check(Modifier.VBCustomEvents); EventAddRemoveRegion eventAccessorDeclaration; EventAddRegion addHandlerAccessorDeclaration = null; @@ -2189,24 +2204,24 @@ out getRegion, out setRegion); Identifier(); -#line 1267 "VBNET.ATG" +#line 1274 "VBNET.ATG" string customEventName = t.val; Expect(48); TypeName( -#line 1268 "VBNET.ATG" +#line 1275 "VBNET.ATG" out type); if (la.kind == 107) { ImplementsClause( -#line 1269 "VBNET.ATG" +#line 1276 "VBNET.ATG" out implementsClause); } Expect(1); while (StartOf(15)) { EventAccessorDeclaration( -#line 1272 "VBNET.ATG" +#line 1279 "VBNET.ATG" out eventAccessorDeclaration); -#line 1274 "VBNET.ATG" +#line 1281 "VBNET.ATG" if(eventAccessorDeclaration is EventAddRegion) { addHandlerAccessorDeclaration = (EventAddRegion)eventAccessorDeclaration; @@ -2225,7 +2240,7 @@ out eventAccessorDeclaration); Expect(93); Expect(1); -#line 1290 "VBNET.ATG" +#line 1297 "VBNET.ATG" if(addHandlerAccessorDeclaration == null) { Error("Need to provide AddHandler accessor."); @@ -2254,7 +2269,7 @@ out eventAccessorDeclaration); case 187: { lexer.NextToken(); -#line 1316 "VBNET.ATG" +#line 1323 "VBNET.ATG" m.Check(Modifier.VBOperators); Point startPos = t.Location; TypeReference returnType = NullTypeReference.Instance; @@ -2266,7 +2281,7 @@ out eventAccessorDeclaration); List returnTypeAttributes = new List(); OverloadableOperator( -#line 1326 "VBNET.ATG" +#line 1333 "VBNET.ATG" out operatorType); Expect(24); if (la.kind == 55) { @@ -2274,16 +2289,16 @@ out operatorType); } Identifier(); -#line 1327 "VBNET.ATG" +#line 1334 "VBNET.ATG" operandName = t.val; if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 1328 "VBNET.ATG" +#line 1335 "VBNET.ATG" out operandType); } -#line 1329 "VBNET.ATG" +#line 1336 "VBNET.ATG" parameters.Add(new ParameterDeclarationExpression(operandType, operandName, ParamModifier.In)); while (la.kind == 12) { lexer.NextToken(); @@ -2292,48 +2307,48 @@ out operandType); } Identifier(); -#line 1333 "VBNET.ATG" +#line 1340 "VBNET.ATG" operandName = t.val; if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 1334 "VBNET.ATG" +#line 1341 "VBNET.ATG" out operandType); } -#line 1335 "VBNET.ATG" +#line 1342 "VBNET.ATG" parameters.Add(new ParameterDeclarationExpression(operandType, operandName, ParamModifier.In)); } Expect(25); -#line 1338 "VBNET.ATG" +#line 1345 "VBNET.ATG" Point endPos = t.EndLocation; if (la.kind == 48) { lexer.NextToken(); while (la.kind == 27) { AttributeSection( -#line 1339 "VBNET.ATG" +#line 1346 "VBNET.ATG" out section); -#line 1339 "VBNET.ATG" +#line 1346 "VBNET.ATG" returnTypeAttributes.Add(section); } TypeName( -#line 1339 "VBNET.ATG" +#line 1346 "VBNET.ATG" out returnType); -#line 1339 "VBNET.ATG" +#line 1346 "VBNET.ATG" endPos = t.EndLocation; Expect(1); } Block( -#line 1340 "VBNET.ATG" +#line 1347 "VBNET.ATG" out stmt); Expect(88); Expect(187); Expect(1); -#line 1342 "VBNET.ATG" +#line 1349 "VBNET.ATG" OperatorDeclaration operatorDeclaration = new OperatorDeclaration(m.Modifier, attributes, parameters, @@ -2355,25 +2370,25 @@ out stmt); } void EnumMemberDecl( -#line 914 "VBNET.ATG" +#line 921 "VBNET.ATG" out FieldDeclaration f) { -#line 916 "VBNET.ATG" +#line 923 "VBNET.ATG" Expression expr = null;List attributes = new List(); AttributeSection section = null; VariableDeclaration varDecl = null; while (la.kind == 27) { AttributeSection( -#line 920 "VBNET.ATG" +#line 927 "VBNET.ATG" out section); -#line 920 "VBNET.ATG" +#line 927 "VBNET.ATG" attributes.Add(section); } Identifier(); -#line 923 "VBNET.ATG" +#line 930 "VBNET.ATG" f = new FieldDeclaration(attributes); varDecl = new VariableDeclaration(t.val); f.Fields.Add(varDecl); @@ -2382,10 +2397,10 @@ out section); if (la.kind == 11) { lexer.NextToken(); Expr( -#line 928 "VBNET.ATG" +#line 935 "VBNET.ATG" out expr); -#line 928 "VBNET.ATG" +#line 935 "VBNET.ATG" varDecl.Initializer = expr; } Expect(1); @@ -2393,7 +2408,7 @@ out expr); void InterfaceMemberDecl() { -#line 831 "VBNET.ATG" +#line 838 "VBNET.ATG" TypeReference type =null; List p = new List(); List templates = new List(); @@ -2405,31 +2420,31 @@ out expr); if (StartOf(16)) { while (la.kind == 27) { AttributeSection( -#line 839 "VBNET.ATG" +#line 846 "VBNET.ATG" out section); -#line 839 "VBNET.ATG" +#line 846 "VBNET.ATG" attributes.Add(section); } while (StartOf(7)) { MemberModifier( -#line 842 "VBNET.ATG" +#line 849 "VBNET.ATG" mod); } if (la.kind == 93) { lexer.NextToken(); -#line 845 "VBNET.ATG" +#line 852 "VBNET.ATG" mod.Check(Modifier.VBInterfaceEvents); Identifier(); -#line 846 "VBNET.ATG" +#line 853 "VBNET.ATG" name = t.val; if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 847 "VBNET.ATG" +#line 854 "VBNET.ATG" p); } Expect(25); @@ -2437,12 +2452,12 @@ p); if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 848 "VBNET.ATG" +#line 855 "VBNET.ATG" out type); } Expect(1); -#line 851 "VBNET.ATG" +#line 858 "VBNET.ATG" EventDeclaration ed = new EventDeclaration(type, mod.Modifier, p, attributes, name, null); compilationUnit.AddChild(ed); ed.EndLocation = t.EndLocation; @@ -2450,27 +2465,27 @@ out type); } else if (la.kind == 167) { lexer.NextToken(); -#line 857 "VBNET.ATG" +#line 864 "VBNET.ATG" mod.Check(Modifier.VBInterfaceMethods); Identifier(); -#line 858 "VBNET.ATG" +#line 865 "VBNET.ATG" name = t.val; TypeParameterList( -#line 859 "VBNET.ATG" +#line 866 "VBNET.ATG" templates); if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 860 "VBNET.ATG" +#line 867 "VBNET.ATG" p); } Expect(25); } Expect(1); -#line 863 "VBNET.ATG" +#line 870 "VBNET.ATG" MethodDeclaration md = new MethodDeclaration(name, mod.Modifier, null, p, attributes); md.TypeReference = new TypeReference("", "System.Void"); md.EndLocation = t.EndLocation; @@ -2480,20 +2495,20 @@ p); } else if (la.kind == 100) { lexer.NextToken(); -#line 871 "VBNET.ATG" +#line 878 "VBNET.ATG" mod.Check(Modifier.VBInterfaceMethods); Identifier(); -#line 872 "VBNET.ATG" +#line 879 "VBNET.ATG" name = t.val; TypeParameterList( -#line 873 "VBNET.ATG" +#line 880 "VBNET.ATG" templates); if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 874 "VBNET.ATG" +#line 881 "VBNET.ATG" p); } Expect(25); @@ -2502,15 +2517,15 @@ p); lexer.NextToken(); while (la.kind == 27) { AttributeSection( -#line 875 "VBNET.ATG" +#line 882 "VBNET.ATG" out returnTypeAttributeSection); } TypeName( -#line 875 "VBNET.ATG" +#line 882 "VBNET.ATG" out type); } -#line 877 "VBNET.ATG" +#line 884 "VBNET.ATG" if(type == null) { type = new TypeReference("System.Object"); } @@ -2527,17 +2542,17 @@ out type); } else if (la.kind == 146) { lexer.NextToken(); -#line 892 "VBNET.ATG" +#line 899 "VBNET.ATG" mod.Check(Modifier.VBInterfaceProperties); Identifier(); -#line 893 "VBNET.ATG" +#line 900 "VBNET.ATG" name = t.val; if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 894 "VBNET.ATG" +#line 901 "VBNET.ATG" p); } Expect(25); @@ -2545,18 +2560,18 @@ p); if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 895 "VBNET.ATG" +#line 902 "VBNET.ATG" out type); } -#line 897 "VBNET.ATG" +#line 904 "VBNET.ATG" if(type == null) { type = new TypeReference("System.Object"); } Expect(1); -#line 903 "VBNET.ATG" +#line 910 "VBNET.ATG" PropertyDeclaration pd = new PropertyDeclaration(name, type, mod.Modifier, attributes); pd.Parameters = p; pd.EndLocation = t.EndLocation; @@ -2565,97 +2580,97 @@ out type); } else SynErr(227); } else if (StartOf(17)) { NonModuleDeclaration( -#line 910 "VBNET.ATG" +#line 917 "VBNET.ATG" mod, attributes); } else SynErr(228); } void Expr( -#line 1719 "VBNET.ATG" +#line 1726 "VBNET.ATG" out Expression expr) { DisjunctionExpr( -#line 1721 "VBNET.ATG" +#line 1728 "VBNET.ATG" out expr); } void ImplementsClause( -#line 1690 "VBNET.ATG" +#line 1697 "VBNET.ATG" out List baseInterfaces) { -#line 1692 "VBNET.ATG" +#line 1699 "VBNET.ATG" baseInterfaces = new List(); TypeReference type = null; string memberName = null; Expect(107); NonArrayTypeName( -#line 1697 "VBNET.ATG" +#line 1704 "VBNET.ATG" out type, false); -#line 1698 "VBNET.ATG" +#line 1705 "VBNET.ATG" if (type != null) memberName = TypeReference.StripLastIdentifierFromType(ref type); -#line 1699 "VBNET.ATG" +#line 1706 "VBNET.ATG" baseInterfaces.Add(new InterfaceImplementation(type, memberName)); while (la.kind == 12) { lexer.NextToken(); NonArrayTypeName( -#line 1701 "VBNET.ATG" +#line 1708 "VBNET.ATG" out type, false); -#line 1702 "VBNET.ATG" +#line 1709 "VBNET.ATG" if (type != null) memberName = TypeReference.StripLastIdentifierFromType(ref type); -#line 1703 "VBNET.ATG" +#line 1710 "VBNET.ATG" baseInterfaces.Add(new InterfaceImplementation(type, memberName)); } } void HandlesClause( -#line 1648 "VBNET.ATG" +#line 1655 "VBNET.ATG" out List handlesClause) { -#line 1650 "VBNET.ATG" +#line 1657 "VBNET.ATG" handlesClause = new List(); string name; Expect(105); EventMemberSpecifier( -#line 1653 "VBNET.ATG" +#line 1660 "VBNET.ATG" out name); -#line 1653 "VBNET.ATG" +#line 1660 "VBNET.ATG" handlesClause.Add(name); while (la.kind == 12) { lexer.NextToken(); EventMemberSpecifier( -#line 1654 "VBNET.ATG" +#line 1661 "VBNET.ATG" out name); -#line 1654 "VBNET.ATG" +#line 1661 "VBNET.ATG" handlesClause.Add(name); } } void Block( -#line 2329 "VBNET.ATG" +#line 2336 "VBNET.ATG" out Statement stmt) { -#line 2332 "VBNET.ATG" +#line 2339 "VBNET.ATG" BlockStatement blockStmt = new BlockStatement(); blockStmt.StartLocation = t.Location; compilationUnit.BlockStart(blockStmt); while (StartOf(18) || -#line 2337 "VBNET.ATG" +#line 2344 "VBNET.ATG" IsEndStmtAhead()) { if ( -#line 2337 "VBNET.ATG" +#line 2344 "VBNET.ATG" IsEndStmtAhead()) { Expect(88); EndOfStmt(); -#line 2337 "VBNET.ATG" +#line 2344 "VBNET.ATG" compilationUnit.AddChild(new EndStatement()); } else { Statement(); @@ -2663,7 +2678,7 @@ IsEndStmtAhead()) { } } -#line 2342 "VBNET.ATG" +#line 2349 "VBNET.ATG" stmt = blockStmt; blockStmt.EndLocation = t.EndLocation; compilationUnit.BlockEnd(); @@ -2671,35 +2686,35 @@ IsEndStmtAhead()) { } void Charset( -#line 1640 "VBNET.ATG" +#line 1647 "VBNET.ATG" out CharsetModifier charsetModifier) { -#line 1641 "VBNET.ATG" +#line 1648 "VBNET.ATG" charsetModifier = CharsetModifier.None; if (la.kind == 100 || la.kind == 167) { } else if (la.kind == 47) { lexer.NextToken(); -#line 1642 "VBNET.ATG" +#line 1649 "VBNET.ATG" charsetModifier = CharsetModifier.ANSI; } else if (la.kind == 50) { lexer.NextToken(); -#line 1643 "VBNET.ATG" +#line 1650 "VBNET.ATG" charsetModifier = CharsetModifier.Auto; } else if (la.kind == 176) { lexer.NextToken(); -#line 1644 "VBNET.ATG" +#line 1651 "VBNET.ATG" charsetModifier = CharsetModifier.Unicode; } else SynErr(229); } void VariableDeclarator( -#line 1528 "VBNET.ATG" +#line 1535 "VBNET.ATG" List fieldDeclaration) { -#line 1530 "VBNET.ATG" +#line 1537 "VBNET.ATG" Expression expr = null; TypeReference type = null; ArrayList rank = null; @@ -2707,31 +2722,31 @@ List fieldDeclaration) { Identifier(); -#line 1535 "VBNET.ATG" +#line 1542 "VBNET.ATG" string name = t.val; if ( -#line 1536 "VBNET.ATG" +#line 1543 "VBNET.ATG" IsSize() && !IsDims()) { ArrayInitializationModifier( -#line 1536 "VBNET.ATG" +#line 1543 "VBNET.ATG" out dimension); } if ( -#line 1537 "VBNET.ATG" +#line 1544 "VBNET.ATG" IsDims()) { ArrayNameModifier( -#line 1537 "VBNET.ATG" +#line 1544 "VBNET.ATG" out rank); } if ( -#line 1539 "VBNET.ATG" +#line 1546 "VBNET.ATG" IsObjectCreation()) { Expect(48); ObjectCreateExpression( -#line 1539 "VBNET.ATG" +#line 1546 "VBNET.ATG" out expr); -#line 1541 "VBNET.ATG" +#line 1548 "VBNET.ATG" if (expr is ObjectCreateExpression) { type = ((ObjectCreateExpression)expr).CreateType; } else { @@ -2742,11 +2757,11 @@ out expr); if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 1548 "VBNET.ATG" +#line 1555 "VBNET.ATG" out type); } -#line 1550 "VBNET.ATG" +#line 1557 "VBNET.ATG" if (type != null && dimension != null) { if(type.RankSpecifier != null) { Error("array rank only allowed one time"); @@ -2772,40 +2787,40 @@ out type); if (la.kind == 11) { lexer.NextToken(); VariableInitializer( -#line 1572 "VBNET.ATG" +#line 1579 "VBNET.ATG" out expr); } } else SynErr(230); -#line 1574 "VBNET.ATG" +#line 1581 "VBNET.ATG" fieldDeclaration.Add(new VariableDeclaration(name, expr, type)); } void ConstantDeclarator( -#line 1511 "VBNET.ATG" +#line 1518 "VBNET.ATG" List constantDeclaration) { -#line 1513 "VBNET.ATG" +#line 1520 "VBNET.ATG" Expression expr = null; TypeReference type = null; string name = String.Empty; Identifier(); -#line 1517 "VBNET.ATG" +#line 1524 "VBNET.ATG" name = t.val; if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 1518 "VBNET.ATG" +#line 1525 "VBNET.ATG" out type); } Expect(11); Expr( -#line 1519 "VBNET.ATG" +#line 1526 "VBNET.ATG" out expr); -#line 1521 "VBNET.ATG" +#line 1528 "VBNET.ATG" VariableDeclaration f = new VariableDeclaration(name, expr); f.TypeReference = type; constantDeclaration.Add(f); @@ -2813,10 +2828,10 @@ out expr); } void AccessorDecls( -#line 1453 "VBNET.ATG" +#line 1460 "VBNET.ATG" out PropertyGetRegion getBlock, out PropertySetRegion setBlock) { -#line 1455 "VBNET.ATG" +#line 1462 "VBNET.ATG" List attributes = new List(); AttributeSection section; getBlock = null; @@ -2824,60 +2839,60 @@ out PropertyGetRegion getBlock, out PropertySetRegion setBlock) { while (la.kind == 27) { AttributeSection( -#line 1460 "VBNET.ATG" +#line 1467 "VBNET.ATG" out section); -#line 1460 "VBNET.ATG" +#line 1467 "VBNET.ATG" attributes.Add(section); } if (la.kind == 101) { GetAccessorDecl( -#line 1462 "VBNET.ATG" +#line 1469 "VBNET.ATG" out getBlock, attributes); if (la.kind == 27 || la.kind == 156) { -#line 1464 "VBNET.ATG" +#line 1471 "VBNET.ATG" attributes = new List(); while (la.kind == 27) { AttributeSection( -#line 1465 "VBNET.ATG" +#line 1472 "VBNET.ATG" out section); -#line 1465 "VBNET.ATG" +#line 1472 "VBNET.ATG" attributes.Add(section); } SetAccessorDecl( -#line 1466 "VBNET.ATG" +#line 1473 "VBNET.ATG" out setBlock, attributes); } } else if (la.kind == 156) { SetAccessorDecl( -#line 1469 "VBNET.ATG" +#line 1476 "VBNET.ATG" out setBlock, attributes); if (la.kind == 27 || la.kind == 101) { -#line 1471 "VBNET.ATG" +#line 1478 "VBNET.ATG" attributes = new List(); while (la.kind == 27) { AttributeSection( -#line 1472 "VBNET.ATG" +#line 1479 "VBNET.ATG" out section); -#line 1472 "VBNET.ATG" +#line 1479 "VBNET.ATG" attributes.Add(section); } GetAccessorDecl( -#line 1473 "VBNET.ATG" +#line 1480 "VBNET.ATG" out getBlock, attributes); } } else SynErr(231); } void EventAccessorDeclaration( -#line 1416 "VBNET.ATG" +#line 1423 "VBNET.ATG" out EventAddRemoveRegion eventAccessorDeclaration) { -#line 1418 "VBNET.ATG" +#line 1425 "VBNET.ATG" Statement stmt = null; List p = new List(); AttributeSection section; @@ -2886,10 +2901,10 @@ out EventAddRemoveRegion eventAccessorDeclaration) { while (la.kind == 27) { AttributeSection( -#line 1424 "VBNET.ATG" +#line 1431 "VBNET.ATG" out section); -#line 1424 "VBNET.ATG" +#line 1431 "VBNET.ATG" attributes.Add(section); } if (la.kind == 42) { @@ -2898,20 +2913,20 @@ out section); lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 1426 "VBNET.ATG" +#line 1433 "VBNET.ATG" p); } Expect(25); } Expect(1); Block( -#line 1427 "VBNET.ATG" +#line 1434 "VBNET.ATG" out stmt); Expect(88); Expect(42); Expect(1); -#line 1429 "VBNET.ATG" +#line 1436 "VBNET.ATG" eventAccessorDeclaration = new EventAddRegion(attributes); eventAccessorDeclaration.Block = (BlockStatement)stmt; eventAccessorDeclaration.Parameters = p; @@ -2922,20 +2937,20 @@ out stmt); lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 1434 "VBNET.ATG" +#line 1441 "VBNET.ATG" p); } Expect(25); } Expect(1); Block( -#line 1435 "VBNET.ATG" +#line 1442 "VBNET.ATG" out stmt); Expect(88); Expect(152); Expect(1); -#line 1437 "VBNET.ATG" +#line 1444 "VBNET.ATG" eventAccessorDeclaration = new EventRemoveRegion(attributes); eventAccessorDeclaration.Block = (BlockStatement)stmt; eventAccessorDeclaration.Parameters = p; @@ -2946,20 +2961,20 @@ out stmt); lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 1442 "VBNET.ATG" +#line 1449 "VBNET.ATG" p); } Expect(25); } Expect(1); Block( -#line 1443 "VBNET.ATG" +#line 1450 "VBNET.ATG" out stmt); Expect(88); Expect(149); Expect(1); -#line 1445 "VBNET.ATG" +#line 1452 "VBNET.ATG" eventAccessorDeclaration = new EventRaiseRegion(attributes); eventAccessorDeclaration.Block = (BlockStatement)stmt; eventAccessorDeclaration.Parameters = p; @@ -2968,163 +2983,163 @@ out stmt); } void OverloadableOperator( -#line 1358 "VBNET.ATG" +#line 1365 "VBNET.ATG" out OverloadableOperatorType operatorType) { -#line 1359 "VBNET.ATG" +#line 1366 "VBNET.ATG" operatorType = OverloadableOperatorType.None; switch (la.kind) { case 14: { lexer.NextToken(); -#line 1361 "VBNET.ATG" +#line 1368 "VBNET.ATG" operatorType = OverloadableOperatorType.Add; break; } case 15: { lexer.NextToken(); -#line 1363 "VBNET.ATG" +#line 1370 "VBNET.ATG" operatorType = OverloadableOperatorType.Subtract; break; } case 16: { lexer.NextToken(); -#line 1365 "VBNET.ATG" +#line 1372 "VBNET.ATG" operatorType = OverloadableOperatorType.Multiply; break; } case 17: { lexer.NextToken(); -#line 1367 "VBNET.ATG" +#line 1374 "VBNET.ATG" operatorType = OverloadableOperatorType.Divide; break; } case 18: { lexer.NextToken(); -#line 1369 "VBNET.ATG" +#line 1376 "VBNET.ATG" operatorType = OverloadableOperatorType.DivideInteger; break; } case 19: { lexer.NextToken(); -#line 1371 "VBNET.ATG" +#line 1378 "VBNET.ATG" operatorType = OverloadableOperatorType.Concat; break; } case 116: { lexer.NextToken(); -#line 1373 "VBNET.ATG" +#line 1380 "VBNET.ATG" operatorType = OverloadableOperatorType.Like; break; } case 120: { lexer.NextToken(); -#line 1375 "VBNET.ATG" +#line 1382 "VBNET.ATG" operatorType = OverloadableOperatorType.Modulus; break; } case 45: { lexer.NextToken(); -#line 1377 "VBNET.ATG" +#line 1384 "VBNET.ATG" operatorType = OverloadableOperatorType.BitwiseAnd; break; } case 138: { lexer.NextToken(); -#line 1379 "VBNET.ATG" +#line 1386 "VBNET.ATG" operatorType = OverloadableOperatorType.BitwiseOr; break; } case 185: { lexer.NextToken(); -#line 1381 "VBNET.ATG" +#line 1388 "VBNET.ATG" operatorType = OverloadableOperatorType.ExclusiveOr; break; } case 20: { lexer.NextToken(); -#line 1383 "VBNET.ATG" +#line 1390 "VBNET.ATG" operatorType = OverloadableOperatorType.Power; break; } case 31: { lexer.NextToken(); -#line 1385 "VBNET.ATG" +#line 1392 "VBNET.ATG" operatorType = OverloadableOperatorType.ShiftLeft; break; } case 32: { lexer.NextToken(); -#line 1387 "VBNET.ATG" +#line 1394 "VBNET.ATG" operatorType = OverloadableOperatorType.ShiftRight; break; } case 11: { lexer.NextToken(); -#line 1389 "VBNET.ATG" +#line 1396 "VBNET.ATG" operatorType = OverloadableOperatorType.Equality; break; } case 28: { lexer.NextToken(); -#line 1391 "VBNET.ATG" +#line 1398 "VBNET.ATG" operatorType = OverloadableOperatorType.InEquality; break; } case 27: { lexer.NextToken(); -#line 1393 "VBNET.ATG" +#line 1400 "VBNET.ATG" operatorType = OverloadableOperatorType.LessThan; break; } case 30: { lexer.NextToken(); -#line 1395 "VBNET.ATG" +#line 1402 "VBNET.ATG" operatorType = OverloadableOperatorType.LessThanOrEqual; break; } case 26: { lexer.NextToken(); -#line 1397 "VBNET.ATG" +#line 1404 "VBNET.ATG" operatorType = OverloadableOperatorType.GreaterThan; break; } case 29: { lexer.NextToken(); -#line 1399 "VBNET.ATG" +#line 1406 "VBNET.ATG" operatorType = OverloadableOperatorType.GreaterThanOrEqual; break; } case 75: { lexer.NextToken(); -#line 1401 "VBNET.ATG" +#line 1408 "VBNET.ATG" operatorType = OverloadableOperatorType.CType; break; } case 2: case 47: case 49: case 50: case 51: case 70: case 144: case 169: case 176: case 177: { Identifier(); -#line 1405 "VBNET.ATG" +#line 1412 "VBNET.ATG" string opName = t.val; if (string.Equals(opName, "istrue", StringComparison.InvariantCultureIgnoreCase)) { operatorType = OverloadableOperatorType.IsTrue; @@ -3141,98 +3156,98 @@ out OverloadableOperatorType operatorType) { } void GetAccessorDecl( -#line 1479 "VBNET.ATG" +#line 1486 "VBNET.ATG" out PropertyGetRegion getBlock, List attributes) { -#line 1480 "VBNET.ATG" +#line 1487 "VBNET.ATG" Statement stmt = null; Expect(101); -#line 1482 "VBNET.ATG" +#line 1489 "VBNET.ATG" Point startLocation = t.Location; Expect(1); Block( -#line 1484 "VBNET.ATG" +#line 1491 "VBNET.ATG" out stmt); -#line 1485 "VBNET.ATG" +#line 1492 "VBNET.ATG" getBlock = new PropertyGetRegion((BlockStatement)stmt, attributes); Expect(88); Expect(101); -#line 1487 "VBNET.ATG" +#line 1494 "VBNET.ATG" getBlock.StartLocation = startLocation; getBlock.EndLocation = t.EndLocation; Expect(1); } void SetAccessorDecl( -#line 1492 "VBNET.ATG" +#line 1499 "VBNET.ATG" out PropertySetRegion setBlock, List attributes) { -#line 1494 "VBNET.ATG" +#line 1501 "VBNET.ATG" Statement stmt = null; List p = new List(); Expect(156); -#line 1497 "VBNET.ATG" +#line 1504 "VBNET.ATG" Point startLocation = t.Location; if (la.kind == 24) { lexer.NextToken(); if (StartOf(4)) { FormalParameterList( -#line 1498 "VBNET.ATG" +#line 1505 "VBNET.ATG" p); } Expect(25); } Expect(1); Block( -#line 1500 "VBNET.ATG" +#line 1507 "VBNET.ATG" out stmt); -#line 1502 "VBNET.ATG" +#line 1509 "VBNET.ATG" setBlock = new PropertySetRegion((BlockStatement)stmt, attributes); setBlock.Parameters = p; Expect(88); Expect(156); -#line 1506 "VBNET.ATG" +#line 1513 "VBNET.ATG" setBlock.StartLocation = startLocation; setBlock.EndLocation = t.EndLocation; Expect(1); } void ArrayInitializationModifier( -#line 1578 "VBNET.ATG" +#line 1585 "VBNET.ATG" out List arrayModifiers) { -#line 1580 "VBNET.ATG" +#line 1587 "VBNET.ATG" arrayModifiers = null; Expect(24); InitializationRankList( -#line 1582 "VBNET.ATG" +#line 1589 "VBNET.ATG" out arrayModifiers); Expect(25); } void ArrayNameModifier( -#line 2122 "VBNET.ATG" +#line 2129 "VBNET.ATG" out ArrayList arrayModifiers) { -#line 2124 "VBNET.ATG" +#line 2131 "VBNET.ATG" arrayModifiers = null; ArrayTypeModifiers( -#line 2126 "VBNET.ATG" +#line 2133 "VBNET.ATG" out arrayModifiers); } void ObjectCreateExpression( -#line 2004 "VBNET.ATG" +#line 2011 "VBNET.ATG" out Expression oce) { -#line 2006 "VBNET.ATG" +#line 2013 "VBNET.ATG" TypeReference type = null; Expression initializer = null; List arguments = null; @@ -3241,37 +3256,37 @@ out Expression oce) { Expect(127); NonArrayTypeName( -#line 2012 "VBNET.ATG" +#line 2019 "VBNET.ATG" out type, false); if (la.kind == 24) { lexer.NextToken(); if (StartOf(20)) { ArgumentList( -#line 2013 "VBNET.ATG" +#line 2020 "VBNET.ATG" out arguments); } Expect(25); } if (la.kind == 22 || -#line 2014 "VBNET.ATG" +#line 2021 "VBNET.ATG" la.kind == Tokens.OpenParenthesis) { if ( -#line 2014 "VBNET.ATG" +#line 2021 "VBNET.ATG" la.kind == Tokens.OpenParenthesis) { ArrayTypeModifiers( -#line 2015 "VBNET.ATG" +#line 2022 "VBNET.ATG" out dimensions); ArrayInitializer( -#line 2016 "VBNET.ATG" +#line 2023 "VBNET.ATG" out initializer); } else { ArrayInitializer( -#line 2017 "VBNET.ATG" +#line 2024 "VBNET.ATG" out initializer); } } -#line 2019 "VBNET.ATG" +#line 2026 "VBNET.ATG" if (initializer == null) { oce = new ObjectCreateExpression(type, arguments); } else { @@ -3286,120 +3301,120 @@ out initializer); } void VariableInitializer( -#line 1612 "VBNET.ATG" +#line 1619 "VBNET.ATG" out Expression initializerExpression) { -#line 1614 "VBNET.ATG" +#line 1621 "VBNET.ATG" initializerExpression = null; if (StartOf(21)) { Expr( -#line 1616 "VBNET.ATG" +#line 1623 "VBNET.ATG" out initializerExpression); } else if (la.kind == 22) { ArrayInitializer( -#line 1617 "VBNET.ATG" +#line 1624 "VBNET.ATG" out initializerExpression); } else SynErr(234); } void InitializationRankList( -#line 1586 "VBNET.ATG" +#line 1593 "VBNET.ATG" out List rank) { -#line 1588 "VBNET.ATG" +#line 1595 "VBNET.ATG" rank = new List(); Expression expr = null; Expr( -#line 1591 "VBNET.ATG" +#line 1598 "VBNET.ATG" out expr); if (la.kind == 172) { lexer.NextToken(); -#line 1593 "VBNET.ATG" +#line 1600 "VBNET.ATG" if (!(expr is PrimitiveExpression) || (expr as PrimitiveExpression).StringValue != "0") Error("lower bound of array must be zero"); Expr( -#line 1596 "VBNET.ATG" +#line 1603 "VBNET.ATG" out expr); } -#line 1598 "VBNET.ATG" +#line 1605 "VBNET.ATG" if (expr != null) { rank.Add(expr); } while (la.kind == 12) { lexer.NextToken(); Expr( -#line 1600 "VBNET.ATG" +#line 1607 "VBNET.ATG" out expr); if (la.kind == 172) { lexer.NextToken(); -#line 1602 "VBNET.ATG" +#line 1609 "VBNET.ATG" if (!(expr is PrimitiveExpression) || (expr as PrimitiveExpression).StringValue != "0") Error("lower bound of array must be zero"); Expr( -#line 1605 "VBNET.ATG" +#line 1612 "VBNET.ATG" out expr); } -#line 1607 "VBNET.ATG" +#line 1614 "VBNET.ATG" if (expr != null) { rank.Add(expr); } } } void ArrayInitializer( -#line 1621 "VBNET.ATG" +#line 1628 "VBNET.ATG" out Expression outExpr) { -#line 1623 "VBNET.ATG" +#line 1630 "VBNET.ATG" Expression expr = null; ArrayInitializerExpression initializer = new ArrayInitializerExpression(); Expect(22); if (StartOf(22)) { VariableInitializer( -#line 1628 "VBNET.ATG" +#line 1635 "VBNET.ATG" out expr); -#line 1630 "VBNET.ATG" +#line 1637 "VBNET.ATG" if (expr != null) { initializer.CreateExpressions.Add(expr); } while ( -#line 1633 "VBNET.ATG" +#line 1640 "VBNET.ATG" NotFinalComma()) { Expect(12); VariableInitializer( -#line 1633 "VBNET.ATG" +#line 1640 "VBNET.ATG" out expr); -#line 1634 "VBNET.ATG" +#line 1641 "VBNET.ATG" if (expr != null) { initializer.CreateExpressions.Add(expr); } } } Expect(23); -#line 1637 "VBNET.ATG" +#line 1644 "VBNET.ATG" outExpr = initializer; } void EventMemberSpecifier( -#line 1707 "VBNET.ATG" +#line 1714 "VBNET.ATG" out string name) { -#line 1708 "VBNET.ATG" +#line 1715 "VBNET.ATG" string type; name = String.Empty; if (StartOf(12)) { Identifier(); -#line 1709 "VBNET.ATG" +#line 1716 "VBNET.ATG" type = t.val; Expect(10); Identifier(); -#line 1711 "VBNET.ATG" +#line 1718 "VBNET.ATG" name = type + "." + t.val; } else if (la.kind == 124) { lexer.NextToken(); @@ -3407,128 +3422,128 @@ out string name) { if (StartOf(12)) { Identifier(); -#line 1714 "VBNET.ATG" +#line 1721 "VBNET.ATG" name = "MyBase." + t.val; } else if (la.kind == 92) { lexer.NextToken(); -#line 1715 "VBNET.ATG" +#line 1722 "VBNET.ATG" name = "MyBase.Error"; } else SynErr(235); } else SynErr(236); } void DisjunctionExpr( -#line 1853 "VBNET.ATG" +#line 1860 "VBNET.ATG" out Expression outExpr) { -#line 1855 "VBNET.ATG" +#line 1862 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ConjunctionExpr( -#line 1858 "VBNET.ATG" +#line 1865 "VBNET.ATG" out outExpr); while (la.kind == 138 || la.kind == 139 || la.kind == 185) { if (la.kind == 138) { lexer.NextToken(); -#line 1861 "VBNET.ATG" +#line 1868 "VBNET.ATG" op = BinaryOperatorType.BitwiseOr; } else if (la.kind == 139) { lexer.NextToken(); -#line 1862 "VBNET.ATG" +#line 1869 "VBNET.ATG" op = BinaryOperatorType.LogicalOr; } else { lexer.NextToken(); -#line 1863 "VBNET.ATG" +#line 1870 "VBNET.ATG" op = BinaryOperatorType.ExclusiveOr; } ConjunctionExpr( -#line 1865 "VBNET.ATG" +#line 1872 "VBNET.ATG" out expr); -#line 1865 "VBNET.ATG" +#line 1872 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void AssignmentOperator( -#line 1724 "VBNET.ATG" +#line 1731 "VBNET.ATG" out AssignmentOperatorType op) { -#line 1725 "VBNET.ATG" +#line 1732 "VBNET.ATG" op = AssignmentOperatorType.None; switch (la.kind) { case 11: { lexer.NextToken(); -#line 1726 "VBNET.ATG" +#line 1733 "VBNET.ATG" op = AssignmentOperatorType.Assign; break; } case 41: { lexer.NextToken(); -#line 1727 "VBNET.ATG" +#line 1734 "VBNET.ATG" op = AssignmentOperatorType.ConcatString; break; } case 33: { lexer.NextToken(); -#line 1728 "VBNET.ATG" +#line 1735 "VBNET.ATG" op = AssignmentOperatorType.Add; break; } case 35: { lexer.NextToken(); -#line 1729 "VBNET.ATG" +#line 1736 "VBNET.ATG" op = AssignmentOperatorType.Subtract; break; } case 36: { lexer.NextToken(); -#line 1730 "VBNET.ATG" +#line 1737 "VBNET.ATG" op = AssignmentOperatorType.Multiply; break; } case 37: { lexer.NextToken(); -#line 1731 "VBNET.ATG" +#line 1738 "VBNET.ATG" op = AssignmentOperatorType.Divide; break; } case 38: { lexer.NextToken(); -#line 1732 "VBNET.ATG" +#line 1739 "VBNET.ATG" op = AssignmentOperatorType.DivideInteger; break; } case 34: { lexer.NextToken(); -#line 1733 "VBNET.ATG" +#line 1740 "VBNET.ATG" op = AssignmentOperatorType.Power; break; } case 39: { lexer.NextToken(); -#line 1734 "VBNET.ATG" +#line 1741 "VBNET.ATG" op = AssignmentOperatorType.ShiftLeft; break; } case 40: { lexer.NextToken(); -#line 1735 "VBNET.ATG" +#line 1742 "VBNET.ATG" op = AssignmentOperatorType.ShiftRight; break; } @@ -3537,10 +3552,10 @@ out AssignmentOperatorType op) { } void SimpleExpr( -#line 1739 "VBNET.ATG" +#line 1746 "VBNET.ATG" out Expression pexpr) { -#line 1741 "VBNET.ATG" +#line 1748 "VBNET.ATG" Expression expr; TypeReference type = null; string name = String.Empty; @@ -3551,136 +3566,136 @@ out Expression pexpr) { case 3: { lexer.NextToken(); -#line 1749 "VBNET.ATG" +#line 1756 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 4: { lexer.NextToken(); -#line 1750 "VBNET.ATG" +#line 1757 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 7: { lexer.NextToken(); -#line 1751 "VBNET.ATG" +#line 1758 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 6: { lexer.NextToken(); -#line 1752 "VBNET.ATG" +#line 1759 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 5: { lexer.NextToken(); -#line 1753 "VBNET.ATG" +#line 1760 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 9: { lexer.NextToken(); -#line 1754 "VBNET.ATG" +#line 1761 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 8: { lexer.NextToken(); -#line 1755 "VBNET.ATG" +#line 1762 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 173: { lexer.NextToken(); -#line 1757 "VBNET.ATG" +#line 1764 "VBNET.ATG" pexpr = new PrimitiveExpression(true, "true"); break; } case 96: { lexer.NextToken(); -#line 1758 "VBNET.ATG" +#line 1765 "VBNET.ATG" pexpr = new PrimitiveExpression(false, "false"); break; } case 130: { lexer.NextToken(); -#line 1759 "VBNET.ATG" +#line 1766 "VBNET.ATG" pexpr = new PrimitiveExpression(null, "null"); break; } case 24: { lexer.NextToken(); Expr( -#line 1760 "VBNET.ATG" +#line 1767 "VBNET.ATG" out expr); Expect(25); -#line 1760 "VBNET.ATG" +#line 1767 "VBNET.ATG" pexpr = new ParenthesizedExpression(expr); break; } case 2: case 47: case 49: case 50: case 51: case 70: case 144: case 169: case 176: case 177: { Identifier(); -#line 1761 "VBNET.ATG" +#line 1768 "VBNET.ATG" pexpr = new IdentifierExpression(t.val); break; } case 52: case 54: case 65: case 76: case 77: case 84: case 111: case 117: case 159: case 160: case 165: case 190: case 191: case 192: case 193: { -#line 1762 "VBNET.ATG" +#line 1769 "VBNET.ATG" string val = String.Empty; PrimitiveTypeName( -#line 1763 "VBNET.ATG" +#line 1770 "VBNET.ATG" out val); Expect(10); -#line 1764 "VBNET.ATG" +#line 1771 "VBNET.ATG" t.val = ""; Identifier(); -#line 1764 "VBNET.ATG" +#line 1771 "VBNET.ATG" pexpr = new FieldReferenceExpression(new TypeReferenceExpression(val), t.val); break; } case 119: { lexer.NextToken(); -#line 1765 "VBNET.ATG" +#line 1772 "VBNET.ATG" pexpr = new ThisReferenceExpression(); break; } case 124: case 125: { -#line 1766 "VBNET.ATG" +#line 1773 "VBNET.ATG" Expression retExpr = null; if (la.kind == 124) { lexer.NextToken(); -#line 1767 "VBNET.ATG" +#line 1774 "VBNET.ATG" retExpr = new BaseReferenceExpression(); } else if (la.kind == 125) { lexer.NextToken(); -#line 1768 "VBNET.ATG" +#line 1775 "VBNET.ATG" retExpr = new ClassReferenceExpression(); } else SynErr(238); Expect(10); IdentifierOrKeyword( -#line 1770 "VBNET.ATG" +#line 1777 "VBNET.ATG" out name); -#line 1770 "VBNET.ATG" +#line 1777 "VBNET.ATG" pexpr = new FieldReferenceExpression(retExpr, name); break; } @@ -3689,77 +3704,77 @@ out name); Expect(10); Identifier(); -#line 1772 "VBNET.ATG" +#line 1779 "VBNET.ATG" type = new TypeReference(t.val ?? ""); -#line 1774 "VBNET.ATG" +#line 1781 "VBNET.ATG" type.IsGlobal = true; -#line 1775 "VBNET.ATG" +#line 1782 "VBNET.ATG" pexpr = new TypeReferenceExpression(type); break; } case 127: { ObjectCreateExpression( -#line 1776 "VBNET.ATG" +#line 1783 "VBNET.ATG" out expr); -#line 1776 "VBNET.ATG" +#line 1783 "VBNET.ATG" pexpr = expr; break; } case 75: case 82: case 199: { -#line 1778 "VBNET.ATG" +#line 1785 "VBNET.ATG" CastType castType = CastType.Cast; if (la.kind == 82) { lexer.NextToken(); } else if (la.kind == 75) { lexer.NextToken(); -#line 1780 "VBNET.ATG" +#line 1787 "VBNET.ATG" castType = CastType.Conversion; } else if (la.kind == 199) { lexer.NextToken(); -#line 1781 "VBNET.ATG" +#line 1788 "VBNET.ATG" castType = CastType.TryCast; } else SynErr(239); Expect(24); Expr( -#line 1783 "VBNET.ATG" +#line 1790 "VBNET.ATG" out expr); Expect(12); TypeName( -#line 1783 "VBNET.ATG" +#line 1790 "VBNET.ATG" out type); Expect(25); -#line 1784 "VBNET.ATG" +#line 1791 "VBNET.ATG" pexpr = new CastExpression(type, expr, castType); break; } case 59: case 60: case 61: case 62: case 63: case 64: case 66: case 68: case 69: case 72: case 73: case 74: case 194: case 195: case 196: case 197: { CastTarget( -#line 1785 "VBNET.ATG" +#line 1792 "VBNET.ATG" out type); Expect(24); Expr( -#line 1785 "VBNET.ATG" +#line 1792 "VBNET.ATG" out expr); Expect(25); -#line 1785 "VBNET.ATG" +#line 1792 "VBNET.ATG" pexpr = new CastExpression(type, expr, CastType.PrimitiveConversion); break; } case 43: { lexer.NextToken(); Expr( -#line 1786 "VBNET.ATG" +#line 1793 "VBNET.ATG" out expr); -#line 1786 "VBNET.ATG" +#line 1793 "VBNET.ATG" pexpr = new AddressOfExpression(expr); break; } @@ -3767,159 +3782,159 @@ out expr); lexer.NextToken(); Expect(24); GetTypeTypeName( -#line 1787 "VBNET.ATG" +#line 1794 "VBNET.ATG" out type); Expect(25); -#line 1787 "VBNET.ATG" +#line 1794 "VBNET.ATG" pexpr = new TypeOfExpression(type); break; } case 175: { lexer.NextToken(); SimpleExpr( -#line 1788 "VBNET.ATG" +#line 1795 "VBNET.ATG" out expr); Expect(113); TypeName( -#line 1788 "VBNET.ATG" +#line 1795 "VBNET.ATG" out type); -#line 1788 "VBNET.ATG" +#line 1795 "VBNET.ATG" pexpr = new TypeOfIsExpression(expr, type); break; } } while (la.kind == 10 || la.kind == 24) { InvocationOrMemberReferenceExpression( -#line 1790 "VBNET.ATG" +#line 1797 "VBNET.ATG" ref pexpr); } } else if (la.kind == 10) { lexer.NextToken(); IdentifierOrKeyword( -#line 1793 "VBNET.ATG" +#line 1800 "VBNET.ATG" out name); -#line 1793 "VBNET.ATG" +#line 1800 "VBNET.ATG" pexpr = new FieldReferenceExpression(pexpr, name); while (la.kind == 10 || la.kind == 24) { InvocationOrMemberReferenceExpression( -#line 1794 "VBNET.ATG" +#line 1801 "VBNET.ATG" ref pexpr); } } else SynErr(240); } void PrimitiveTypeName( -#line 2933 "VBNET.ATG" +#line 2940 "VBNET.ATG" out string type) { -#line 2934 "VBNET.ATG" +#line 2941 "VBNET.ATG" type = String.Empty; switch (la.kind) { case 52: { lexer.NextToken(); -#line 2935 "VBNET.ATG" +#line 2942 "VBNET.ATG" type = "Boolean"; break; } case 76: { lexer.NextToken(); -#line 2936 "VBNET.ATG" +#line 2943 "VBNET.ATG" type = "Date"; break; } case 65: { lexer.NextToken(); -#line 2937 "VBNET.ATG" +#line 2944 "VBNET.ATG" type = "Char"; break; } case 165: { lexer.NextToken(); -#line 2938 "VBNET.ATG" +#line 2945 "VBNET.ATG" type = "String"; break; } case 77: { lexer.NextToken(); -#line 2939 "VBNET.ATG" +#line 2946 "VBNET.ATG" type = "Decimal"; break; } case 54: { lexer.NextToken(); -#line 2940 "VBNET.ATG" +#line 2947 "VBNET.ATG" type = "Byte"; break; } case 159: { lexer.NextToken(); -#line 2941 "VBNET.ATG" +#line 2948 "VBNET.ATG" type = "Short"; break; } case 111: { lexer.NextToken(); -#line 2942 "VBNET.ATG" +#line 2949 "VBNET.ATG" type = "Integer"; break; } case 117: { lexer.NextToken(); -#line 2943 "VBNET.ATG" +#line 2950 "VBNET.ATG" type = "Long"; break; } case 160: { lexer.NextToken(); -#line 2944 "VBNET.ATG" +#line 2951 "VBNET.ATG" type = "Single"; break; } case 84: { lexer.NextToken(); -#line 2945 "VBNET.ATG" +#line 2952 "VBNET.ATG" type = "Double"; break; } case 191: { lexer.NextToken(); -#line 2946 "VBNET.ATG" +#line 2953 "VBNET.ATG" type = "UInteger"; break; } case 192: { lexer.NextToken(); -#line 2947 "VBNET.ATG" +#line 2954 "VBNET.ATG" type = "ULong"; break; } case 193: { lexer.NextToken(); -#line 2948 "VBNET.ATG" +#line 2955 "VBNET.ATG" type = "UShort"; break; } case 190: { lexer.NextToken(); -#line 2949 "VBNET.ATG" +#line 2956 "VBNET.ATG" type = "SByte"; break; } @@ -3928,130 +3943,130 @@ out string type) { } void IdentifierOrKeyword( -#line 2926 "VBNET.ATG" +#line 2933 "VBNET.ATG" out string name) { -#line 2928 "VBNET.ATG" +#line 2935 "VBNET.ATG" lexer.NextToken(); name = t.val; } void CastTarget( -#line 1831 "VBNET.ATG" +#line 1838 "VBNET.ATG" out TypeReference type) { -#line 1833 "VBNET.ATG" +#line 1840 "VBNET.ATG" type = null; switch (la.kind) { case 59: { lexer.NextToken(); -#line 1835 "VBNET.ATG" +#line 1842 "VBNET.ATG" type = new TypeReference("System.Boolean"); break; } case 60: { lexer.NextToken(); -#line 1836 "VBNET.ATG" +#line 1843 "VBNET.ATG" type = new TypeReference("System.Byte"); break; } case 194: { lexer.NextToken(); -#line 1837 "VBNET.ATG" +#line 1844 "VBNET.ATG" type = new TypeReference("System.SByte"); break; } case 61: { lexer.NextToken(); -#line 1838 "VBNET.ATG" +#line 1845 "VBNET.ATG" type = new TypeReference("System.Char"); break; } case 62: { lexer.NextToken(); -#line 1839 "VBNET.ATG" +#line 1846 "VBNET.ATG" type = new TypeReference("System.DateTime"); break; } case 64: { lexer.NextToken(); -#line 1840 "VBNET.ATG" +#line 1847 "VBNET.ATG" type = new TypeReference("System.Decimal"); break; } case 63: { lexer.NextToken(); -#line 1841 "VBNET.ATG" +#line 1848 "VBNET.ATG" type = new TypeReference("System.Double"); break; } case 72: { lexer.NextToken(); -#line 1842 "VBNET.ATG" +#line 1849 "VBNET.ATG" type = new TypeReference("System.Int16"); break; } case 66: { lexer.NextToken(); -#line 1843 "VBNET.ATG" +#line 1850 "VBNET.ATG" type = new TypeReference("System.Int32"); break; } case 68: { lexer.NextToken(); -#line 1844 "VBNET.ATG" +#line 1851 "VBNET.ATG" type = new TypeReference("System.Int64"); break; } case 195: { lexer.NextToken(); -#line 1845 "VBNET.ATG" +#line 1852 "VBNET.ATG" type = new TypeReference("System.UInt16"); break; } case 196: { lexer.NextToken(); -#line 1846 "VBNET.ATG" +#line 1853 "VBNET.ATG" type = new TypeReference("System.UInt32"); break; } case 197: { lexer.NextToken(); -#line 1847 "VBNET.ATG" +#line 1854 "VBNET.ATG" type = new TypeReference("System.UInt64"); break; } case 69: { lexer.NextToken(); -#line 1848 "VBNET.ATG" +#line 1855 "VBNET.ATG" type = new TypeReference("System.Object"); break; } case 73: { lexer.NextToken(); -#line 1849 "VBNET.ATG" +#line 1856 "VBNET.ATG" type = new TypeReference("System.Single"); break; } case 74: { lexer.NextToken(); -#line 1850 "VBNET.ATG" +#line 1857 "VBNET.ATG" type = new TypeReference("System.String"); break; } @@ -4060,19 +4075,19 @@ out TypeReference type) { } void GetTypeTypeName( -#line 2074 "VBNET.ATG" +#line 2081 "VBNET.ATG" out TypeReference typeref) { -#line 2075 "VBNET.ATG" +#line 2082 "VBNET.ATG" ArrayList rank = null; NonArrayTypeName( -#line 2077 "VBNET.ATG" +#line 2084 "VBNET.ATG" out typeref, true); ArrayTypeModifiers( -#line 2078 "VBNET.ATG" +#line 2085 "VBNET.ATG" out rank); -#line 2079 "VBNET.ATG" +#line 2086 "VBNET.ATG" if (rank != null && typeref != null) { typeref.RankSpecifier = (int[])rank.ToArray(typeof(int)); } @@ -4080,405 +4095,405 @@ out rank); } void InvocationOrMemberReferenceExpression( -#line 1798 "VBNET.ATG" +#line 1805 "VBNET.ATG" ref Expression pexpr) { -#line 1799 "VBNET.ATG" +#line 1806 "VBNET.ATG" string name; if (la.kind == 10) { lexer.NextToken(); IdentifierOrKeyword( -#line 1801 "VBNET.ATG" +#line 1808 "VBNET.ATG" out name); -#line 1801 "VBNET.ATG" +#line 1808 "VBNET.ATG" pexpr = new FieldReferenceExpression(pexpr, name); } else if (la.kind == 24) { InvocationExpression( -#line 1802 "VBNET.ATG" +#line 1809 "VBNET.ATG" ref pexpr); } else SynErr(243); } void InvocationExpression( -#line 1805 "VBNET.ATG" +#line 1812 "VBNET.ATG" ref Expression pexpr) { -#line 1806 "VBNET.ATG" +#line 1813 "VBNET.ATG" List typeParameters = new List(); List parameters = null; TypeReference type; Expect(24); -#line 1810 "VBNET.ATG" +#line 1817 "VBNET.ATG" Point start = t.Location; if (la.kind == 200) { lexer.NextToken(); TypeName( -#line 1812 "VBNET.ATG" +#line 1819 "VBNET.ATG" out type); -#line 1812 "VBNET.ATG" +#line 1819 "VBNET.ATG" if (type != null) typeParameters.Add(type); Expect(25); if (la.kind == 10) { lexer.NextToken(); Identifier(); -#line 1816 "VBNET.ATG" +#line 1823 "VBNET.ATG" pexpr = new FieldReferenceExpression(GetTypeReferenceExpression(pexpr, typeParameters), t.val); } else if (la.kind == 24) { lexer.NextToken(); ArgumentList( -#line 1818 "VBNET.ATG" +#line 1825 "VBNET.ATG" out parameters); Expect(25); -#line 1820 "VBNET.ATG" +#line 1827 "VBNET.ATG" pexpr = new InvocationExpression(pexpr, parameters, typeParameters); } else SynErr(244); } else if (StartOf(20)) { ArgumentList( -#line 1822 "VBNET.ATG" +#line 1829 "VBNET.ATG" out parameters); Expect(25); -#line 1824 "VBNET.ATG" +#line 1831 "VBNET.ATG" pexpr = new InvocationExpression(pexpr, parameters, typeParameters); } else SynErr(245); -#line 1826 "VBNET.ATG" +#line 1833 "VBNET.ATG" pexpr.StartLocation = start; pexpr.EndLocation = t.Location; } void ArgumentList( -#line 2033 "VBNET.ATG" +#line 2040 "VBNET.ATG" out List arguments) { -#line 2035 "VBNET.ATG" +#line 2042 "VBNET.ATG" arguments = new List(); Expression expr = null; if (StartOf(21)) { Argument( -#line 2039 "VBNET.ATG" +#line 2046 "VBNET.ATG" out expr); -#line 2039 "VBNET.ATG" +#line 2046 "VBNET.ATG" if (expr != null) { arguments.Add(expr); } while (la.kind == 12) { lexer.NextToken(); Argument( -#line 2042 "VBNET.ATG" +#line 2049 "VBNET.ATG" out expr); -#line 2042 "VBNET.ATG" +#line 2049 "VBNET.ATG" if (expr != null) { arguments.Add(expr); } } } } void ConjunctionExpr( -#line 1869 "VBNET.ATG" +#line 1876 "VBNET.ATG" out Expression outExpr) { -#line 1871 "VBNET.ATG" +#line 1878 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; NotExpr( -#line 1874 "VBNET.ATG" +#line 1881 "VBNET.ATG" out outExpr); while (la.kind == 45 || la.kind == 46) { if (la.kind == 45) { lexer.NextToken(); -#line 1877 "VBNET.ATG" +#line 1884 "VBNET.ATG" op = BinaryOperatorType.BitwiseAnd; } else { lexer.NextToken(); -#line 1878 "VBNET.ATG" +#line 1885 "VBNET.ATG" op = BinaryOperatorType.LogicalAnd; } NotExpr( -#line 1880 "VBNET.ATG" +#line 1887 "VBNET.ATG" out expr); -#line 1880 "VBNET.ATG" +#line 1887 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void NotExpr( -#line 1884 "VBNET.ATG" +#line 1891 "VBNET.ATG" out Expression outExpr) { -#line 1885 "VBNET.ATG" +#line 1892 "VBNET.ATG" UnaryOperatorType uop = UnaryOperatorType.None; while (la.kind == 129) { lexer.NextToken(); -#line 1886 "VBNET.ATG" +#line 1893 "VBNET.ATG" uop = UnaryOperatorType.Not; } ComparisonExpr( -#line 1887 "VBNET.ATG" +#line 1894 "VBNET.ATG" out outExpr); -#line 1888 "VBNET.ATG" +#line 1895 "VBNET.ATG" if (uop != UnaryOperatorType.None) outExpr = new UnaryOperatorExpression(outExpr, uop); } void ComparisonExpr( -#line 1893 "VBNET.ATG" +#line 1900 "VBNET.ATG" out Expression outExpr) { -#line 1895 "VBNET.ATG" +#line 1902 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ShiftExpr( -#line 1898 "VBNET.ATG" +#line 1905 "VBNET.ATG" out outExpr); while (StartOf(24)) { switch (la.kind) { case 27: { lexer.NextToken(); -#line 1901 "VBNET.ATG" +#line 1908 "VBNET.ATG" op = BinaryOperatorType.LessThan; break; } case 26: { lexer.NextToken(); -#line 1902 "VBNET.ATG" +#line 1909 "VBNET.ATG" op = BinaryOperatorType.GreaterThan; break; } case 30: { lexer.NextToken(); -#line 1903 "VBNET.ATG" +#line 1910 "VBNET.ATG" op = BinaryOperatorType.LessThanOrEqual; break; } case 29: { lexer.NextToken(); -#line 1904 "VBNET.ATG" +#line 1911 "VBNET.ATG" op = BinaryOperatorType.GreaterThanOrEqual; break; } case 28: { lexer.NextToken(); -#line 1905 "VBNET.ATG" +#line 1912 "VBNET.ATG" op = BinaryOperatorType.InEquality; break; } case 11: { lexer.NextToken(); -#line 1906 "VBNET.ATG" +#line 1913 "VBNET.ATG" op = BinaryOperatorType.Equality; break; } case 116: { lexer.NextToken(); -#line 1907 "VBNET.ATG" +#line 1914 "VBNET.ATG" op = BinaryOperatorType.Like; break; } case 113: { lexer.NextToken(); -#line 1908 "VBNET.ATG" +#line 1915 "VBNET.ATG" op = BinaryOperatorType.ReferenceEquality; break; } case 189: { lexer.NextToken(); -#line 1909 "VBNET.ATG" +#line 1916 "VBNET.ATG" op = BinaryOperatorType.ReferenceInequality; break; } } ShiftExpr( -#line 1911 "VBNET.ATG" +#line 1918 "VBNET.ATG" out expr); -#line 1911 "VBNET.ATG" +#line 1918 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void ShiftExpr( -#line 1915 "VBNET.ATG" +#line 1922 "VBNET.ATG" out Expression outExpr) { -#line 1917 "VBNET.ATG" +#line 1924 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ConcatenationExpr( -#line 1920 "VBNET.ATG" +#line 1927 "VBNET.ATG" out outExpr); while (la.kind == 31 || la.kind == 32) { if (la.kind == 31) { lexer.NextToken(); -#line 1923 "VBNET.ATG" +#line 1930 "VBNET.ATG" op = BinaryOperatorType.ShiftLeft; } else { lexer.NextToken(); -#line 1924 "VBNET.ATG" +#line 1931 "VBNET.ATG" op = BinaryOperatorType.ShiftRight; } ConcatenationExpr( -#line 1926 "VBNET.ATG" +#line 1933 "VBNET.ATG" out expr); -#line 1926 "VBNET.ATG" +#line 1933 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void ConcatenationExpr( -#line 1930 "VBNET.ATG" +#line 1937 "VBNET.ATG" out Expression outExpr) { -#line 1931 "VBNET.ATG" +#line 1938 "VBNET.ATG" Expression expr; AdditiveExpr( -#line 1933 "VBNET.ATG" +#line 1940 "VBNET.ATG" out outExpr); while (la.kind == 19) { lexer.NextToken(); AdditiveExpr( -#line 1933 "VBNET.ATG" +#line 1940 "VBNET.ATG" out expr); -#line 1933 "VBNET.ATG" +#line 1940 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.Concat, expr); } } void AdditiveExpr( -#line 1936 "VBNET.ATG" +#line 1943 "VBNET.ATG" out Expression outExpr) { -#line 1938 "VBNET.ATG" +#line 1945 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; ModuloExpr( -#line 1941 "VBNET.ATG" +#line 1948 "VBNET.ATG" out outExpr); while (la.kind == 14 || la.kind == 15) { if (la.kind == 14) { lexer.NextToken(); -#line 1944 "VBNET.ATG" +#line 1951 "VBNET.ATG" op = BinaryOperatorType.Add; } else { lexer.NextToken(); -#line 1945 "VBNET.ATG" +#line 1952 "VBNET.ATG" op = BinaryOperatorType.Subtract; } ModuloExpr( -#line 1947 "VBNET.ATG" +#line 1954 "VBNET.ATG" out expr); -#line 1947 "VBNET.ATG" +#line 1954 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void ModuloExpr( -#line 1951 "VBNET.ATG" +#line 1958 "VBNET.ATG" out Expression outExpr) { -#line 1952 "VBNET.ATG" +#line 1959 "VBNET.ATG" Expression expr; IntegerDivisionExpr( -#line 1954 "VBNET.ATG" +#line 1961 "VBNET.ATG" out outExpr); while (la.kind == 120) { lexer.NextToken(); IntegerDivisionExpr( -#line 1954 "VBNET.ATG" +#line 1961 "VBNET.ATG" out expr); -#line 1954 "VBNET.ATG" +#line 1961 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.Modulus, expr); } } void IntegerDivisionExpr( -#line 1957 "VBNET.ATG" +#line 1964 "VBNET.ATG" out Expression outExpr) { -#line 1958 "VBNET.ATG" +#line 1965 "VBNET.ATG" Expression expr; MultiplicativeExpr( -#line 1960 "VBNET.ATG" +#line 1967 "VBNET.ATG" out outExpr); while (la.kind == 18) { lexer.NextToken(); MultiplicativeExpr( -#line 1960 "VBNET.ATG" +#line 1967 "VBNET.ATG" out expr); -#line 1960 "VBNET.ATG" +#line 1967 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.DivideInteger, expr); } } void MultiplicativeExpr( -#line 1963 "VBNET.ATG" +#line 1970 "VBNET.ATG" out Expression outExpr) { -#line 1965 "VBNET.ATG" +#line 1972 "VBNET.ATG" Expression expr; BinaryOperatorType op = BinaryOperatorType.None; UnaryExpr( -#line 1968 "VBNET.ATG" +#line 1975 "VBNET.ATG" out outExpr); while (la.kind == 16 || la.kind == 17) { if (la.kind == 16) { lexer.NextToken(); -#line 1971 "VBNET.ATG" +#line 1978 "VBNET.ATG" op = BinaryOperatorType.Multiply; } else { lexer.NextToken(); -#line 1972 "VBNET.ATG" +#line 1979 "VBNET.ATG" op = BinaryOperatorType.Divide; } UnaryExpr( -#line 1974 "VBNET.ATG" +#line 1981 "VBNET.ATG" out expr); -#line 1974 "VBNET.ATG" +#line 1981 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, op, expr); } } void UnaryExpr( -#line 1978 "VBNET.ATG" +#line 1985 "VBNET.ATG" out Expression uExpr) { -#line 1980 "VBNET.ATG" +#line 1987 "VBNET.ATG" Expression expr; UnaryOperatorType uop = UnaryOperatorType.None; bool isUOp = false; @@ -4487,25 +4502,25 @@ out Expression uExpr) { if (la.kind == 14) { lexer.NextToken(); -#line 1984 "VBNET.ATG" +#line 1991 "VBNET.ATG" uop = UnaryOperatorType.Plus; isUOp = true; } else if (la.kind == 15) { lexer.NextToken(); -#line 1985 "VBNET.ATG" +#line 1992 "VBNET.ATG" uop = UnaryOperatorType.Minus; isUOp = true; } else { lexer.NextToken(); -#line 1986 "VBNET.ATG" +#line 1993 "VBNET.ATG" uop = UnaryOperatorType.Star; isUOp = true; } } ExponentiationExpr( -#line 1988 "VBNET.ATG" +#line 1995 "VBNET.ATG" out expr); -#line 1990 "VBNET.ATG" +#line 1997 "VBNET.ATG" if (isUOp) { uExpr = new UnaryOperatorExpression(expr, uop); } else { @@ -4515,50 +4530,50 @@ out expr); } void ExponentiationExpr( -#line 1998 "VBNET.ATG" +#line 2005 "VBNET.ATG" out Expression outExpr) { -#line 1999 "VBNET.ATG" +#line 2006 "VBNET.ATG" Expression expr; SimpleExpr( -#line 2001 "VBNET.ATG" +#line 2008 "VBNET.ATG" out outExpr); while (la.kind == 20) { lexer.NextToken(); SimpleExpr( -#line 2001 "VBNET.ATG" +#line 2008 "VBNET.ATG" out expr); -#line 2001 "VBNET.ATG" +#line 2008 "VBNET.ATG" outExpr = new BinaryOperatorExpression(outExpr, BinaryOperatorType.Power, expr); } } void ArrayTypeModifiers( -#line 2131 "VBNET.ATG" +#line 2138 "VBNET.ATG" out ArrayList arrayModifiers) { -#line 2133 "VBNET.ATG" +#line 2140 "VBNET.ATG" arrayModifiers = new ArrayList(); int i = 0; while ( -#line 2136 "VBNET.ATG" +#line 2143 "VBNET.ATG" IsDims()) { Expect(24); if (la.kind == 12 || la.kind == 25) { RankList( -#line 2138 "VBNET.ATG" +#line 2145 "VBNET.ATG" out i); } -#line 2140 "VBNET.ATG" +#line 2147 "VBNET.ATG" arrayModifiers.Add(i); Expect(25); } -#line 2145 "VBNET.ATG" +#line 2152 "VBNET.ATG" if(arrayModifiers.Count == 0) { arrayModifiers = null; } @@ -4566,69 +4581,69 @@ out i); } void Argument( -#line 2048 "VBNET.ATG" +#line 2055 "VBNET.ATG" out Expression argumentexpr) { -#line 2050 "VBNET.ATG" +#line 2057 "VBNET.ATG" Expression expr; argumentexpr = null; string name; if ( -#line 2054 "VBNET.ATG" +#line 2061 "VBNET.ATG" IsNamedAssign()) { Identifier(); -#line 2054 "VBNET.ATG" +#line 2061 "VBNET.ATG" name = t.val; Expect(13); Expect(11); Expr( -#line 2054 "VBNET.ATG" +#line 2061 "VBNET.ATG" out expr); -#line 2056 "VBNET.ATG" +#line 2063 "VBNET.ATG" argumentexpr = new NamedArgumentExpression(name, expr); } else if (StartOf(21)) { Expr( -#line 2059 "VBNET.ATG" +#line 2066 "VBNET.ATG" out argumentexpr); } else SynErr(246); } void QualIdentAndTypeArguments( -#line 2105 "VBNET.ATG" +#line 2112 "VBNET.ATG" out TypeReference typeref, bool canBeUnbound) { -#line 2106 "VBNET.ATG" +#line 2113 "VBNET.ATG" string name; typeref = null; Qualident( -#line 2108 "VBNET.ATG" +#line 2115 "VBNET.ATG" out name); -#line 2109 "VBNET.ATG" +#line 2116 "VBNET.ATG" typeref = new TypeReference(name); if ( -#line 2110 "VBNET.ATG" +#line 2117 "VBNET.ATG" la.kind == Tokens.OpenParenthesis && Peek(1).kind == Tokens.Of) { lexer.NextToken(); Expect(200); if ( -#line 2112 "VBNET.ATG" +#line 2119 "VBNET.ATG" canBeUnbound && (la.kind == Tokens.CloseParenthesis || la.kind == Tokens.Comma)) { -#line 2113 "VBNET.ATG" +#line 2120 "VBNET.ATG" typeref.GenericTypes.Add(NullTypeReference.Instance); while (la.kind == 12) { lexer.NextToken(); -#line 2114 "VBNET.ATG" +#line 2121 "VBNET.ATG" typeref.GenericTypes.Add(NullTypeReference.Instance); } } else if (StartOf(5)) { TypeArgumentList( -#line 2115 "VBNET.ATG" +#line 2122 "VBNET.ATG" typeref.GenericTypes); } else SynErr(247); Expect(25); @@ -4636,48 +4651,48 @@ typeref.GenericTypes); } void TypeArgumentList( -#line 2158 "VBNET.ATG" +#line 2165 "VBNET.ATG" List typeArguments) { -#line 2160 "VBNET.ATG" +#line 2167 "VBNET.ATG" TypeReference typeref; TypeName( -#line 2162 "VBNET.ATG" +#line 2169 "VBNET.ATG" out typeref); -#line 2162 "VBNET.ATG" +#line 2169 "VBNET.ATG" if (typeref != null) typeArguments.Add(typeref); while (la.kind == 12) { lexer.NextToken(); TypeName( -#line 2165 "VBNET.ATG" +#line 2172 "VBNET.ATG" out typeref); -#line 2165 "VBNET.ATG" +#line 2172 "VBNET.ATG" if (typeref != null) typeArguments.Add(typeref); } } void RankList( -#line 2152 "VBNET.ATG" +#line 2159 "VBNET.ATG" out int i) { -#line 2153 "VBNET.ATG" +#line 2160 "VBNET.ATG" i = 0; while (la.kind == 12) { lexer.NextToken(); -#line 2154 "VBNET.ATG" +#line 2161 "VBNET.ATG" ++i; } } void Attribute( -#line 2190 "VBNET.ATG" +#line 2197 "VBNET.ATG" out ICSharpCode.NRefactory.Parser.AST.Attribute attribute) { -#line 2191 "VBNET.ATG" +#line 2198 "VBNET.ATG" string name; List positional = new List(); List named = new List(); @@ -4687,39 +4702,39 @@ out ICSharpCode.NRefactory.Parser.AST.Attribute attribute) { Expect(10); } Qualident( -#line 2196 "VBNET.ATG" +#line 2203 "VBNET.ATG" out name); if (la.kind == 24) { AttributeArguments( -#line 2197 "VBNET.ATG" +#line 2204 "VBNET.ATG" positional, named); } -#line 2198 "VBNET.ATG" +#line 2205 "VBNET.ATG" attribute = new ICSharpCode.NRefactory.Parser.AST.Attribute(name, positional, named); } void AttributeArguments( -#line 2202 "VBNET.ATG" +#line 2209 "VBNET.ATG" List positional, List named) { -#line 2204 "VBNET.ATG" +#line 2211 "VBNET.ATG" bool nameFound = false; string name = ""; Expression expr; Expect(24); if ( -#line 2210 "VBNET.ATG" +#line 2217 "VBNET.ATG" IsNotClosingParenthesis()) { if ( -#line 2212 "VBNET.ATG" +#line 2219 "VBNET.ATG" IsNamedAssign()) { -#line 2212 "VBNET.ATG" +#line 2219 "VBNET.ATG" nameFound = true; IdentifierOrKeyword( -#line 2213 "VBNET.ATG" +#line 2220 "VBNET.ATG" out name); if (la.kind == 13) { lexer.NextToken(); @@ -4727,10 +4742,10 @@ out name); Expect(11); } Expr( -#line 2215 "VBNET.ATG" +#line 2222 "VBNET.ATG" out expr); -#line 2217 "VBNET.ATG" +#line 2224 "VBNET.ATG" if (expr != null) { if(name == "") positional.Add(expr); else { named.Add(new NamedArgumentExpression(name, expr)); name = ""; } } @@ -4738,13 +4753,13 @@ out expr); while (la.kind == 12) { lexer.NextToken(); if ( -#line 2224 "VBNET.ATG" +#line 2231 "VBNET.ATG" IsNamedAssign()) { -#line 2224 "VBNET.ATG" +#line 2231 "VBNET.ATG" nameFound = true; IdentifierOrKeyword( -#line 2225 "VBNET.ATG" +#line 2232 "VBNET.ATG" out name); if (la.kind == 13) { lexer.NextToken(); @@ -4752,14 +4767,14 @@ out name); Expect(11); } else if (StartOf(21)) { -#line 2227 "VBNET.ATG" +#line 2234 "VBNET.ATG" if (nameFound) Error("no positional argument after named argument"); } else SynErr(248); Expr( -#line 2228 "VBNET.ATG" +#line 2235 "VBNET.ATG" out expr); -#line 2228 "VBNET.ATG" +#line 2235 "VBNET.ATG" if (expr != null) { if(name == "") positional.Add(expr); else { named.Add(new NamedArgumentExpression(name, expr)); name = ""; } } @@ -4770,10 +4785,10 @@ out expr); } void FormalParameter( -#line 2297 "VBNET.ATG" +#line 2304 "VBNET.ATG" out ParameterDeclarationExpression p) { -#line 2299 "VBNET.ATG" +#line 2306 "VBNET.ATG" TypeReference type = null; ParamModifiers mod = new ParamModifiers(this); Expression expr = null; @@ -4781,28 +4796,28 @@ out ParameterDeclarationExpression p) { while (StartOf(25)) { ParameterModifier( -#line 2304 "VBNET.ATG" +#line 2311 "VBNET.ATG" mod); } Identifier(); -#line 2305 "VBNET.ATG" +#line 2312 "VBNET.ATG" string parameterName = t.val; if ( -#line 2306 "VBNET.ATG" +#line 2313 "VBNET.ATG" IsDims()) { ArrayTypeModifiers( -#line 2306 "VBNET.ATG" +#line 2313 "VBNET.ATG" out arrayModifiers); } if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 2307 "VBNET.ATG" +#line 2314 "VBNET.ATG" out type); } -#line 2309 "VBNET.ATG" +#line 2316 "VBNET.ATG" if(type != null) { if (arrayModifiers != null) { if (type.RankSpecifier != null) { @@ -4818,45 +4833,45 @@ out type); if (la.kind == 11) { lexer.NextToken(); Expr( -#line 2321 "VBNET.ATG" +#line 2328 "VBNET.ATG" out expr); } -#line 2323 "VBNET.ATG" +#line 2330 "VBNET.ATG" mod.Check(); p = new ParameterDeclarationExpression(type, parameterName, mod.Modifier, expr); } void ParameterModifier( -#line 2952 "VBNET.ATG" +#line 2959 "VBNET.ATG" ParamModifiers m) { if (la.kind == 55) { lexer.NextToken(); -#line 2953 "VBNET.ATG" +#line 2960 "VBNET.ATG" m.Add(ParamModifier.In); } else if (la.kind == 53) { lexer.NextToken(); -#line 2954 "VBNET.ATG" +#line 2961 "VBNET.ATG" m.Add(ParamModifier.Ref); } else if (la.kind == 137) { lexer.NextToken(); -#line 2955 "VBNET.ATG" +#line 2962 "VBNET.ATG" m.Add(ParamModifier.Optional); } else if (la.kind == 143) { lexer.NextToken(); -#line 2956 "VBNET.ATG" +#line 2963 "VBNET.ATG" m.Add(ParamModifier.Params); } else SynErr(249); } void Statement() { -#line 2350 "VBNET.ATG" +#line 2357 "VBNET.ATG" Statement stmt = null; Point startPos = la.Location; string label = String.Empty; @@ -4864,34 +4879,34 @@ ParamModifiers m) { if (la.kind == 1 || la.kind == 13) { } else if ( -#line 2356 "VBNET.ATG" +#line 2363 "VBNET.ATG" IsLabel()) { LabelName( -#line 2356 "VBNET.ATG" +#line 2363 "VBNET.ATG" out label); -#line 2358 "VBNET.ATG" +#line 2365 "VBNET.ATG" compilationUnit.AddChild(new LabelStatement(t.val)); Expect(13); Statement(); } else if (StartOf(26)) { EmbeddedStatement( -#line 2361 "VBNET.ATG" +#line 2368 "VBNET.ATG" out stmt); -#line 2361 "VBNET.ATG" +#line 2368 "VBNET.ATG" compilationUnit.AddChild(stmt); } else if (StartOf(27)) { LocalDeclarationStatement( -#line 2362 "VBNET.ATG" +#line 2369 "VBNET.ATG" out stmt); -#line 2362 "VBNET.ATG" +#line 2369 "VBNET.ATG" compilationUnit.AddChild(stmt); } else SynErr(250); -#line 2365 "VBNET.ATG" +#line 2372 "VBNET.ATG" if (stmt != null) { stmt.StartLocation = startPos; stmt.EndLocation = t.Location; @@ -4900,30 +4915,30 @@ out stmt); } void LabelName( -#line 2752 "VBNET.ATG" +#line 2759 "VBNET.ATG" out string name) { -#line 2754 "VBNET.ATG" +#line 2761 "VBNET.ATG" name = String.Empty; if (StartOf(12)) { Identifier(); -#line 2756 "VBNET.ATG" +#line 2763 "VBNET.ATG" name = t.val; } else if (la.kind == 5) { lexer.NextToken(); -#line 2757 "VBNET.ATG" +#line 2764 "VBNET.ATG" name = t.val; } else SynErr(251); } void EmbeddedStatement( -#line 2404 "VBNET.ATG" +#line 2411 "VBNET.ATG" out Statement statement) { -#line 2406 "VBNET.ATG" +#line 2413 "VBNET.ATG" Statement embeddedStatement = null; statement = null; Expression expr = null; @@ -4934,103 +4949,103 @@ out Statement statement) { case 94: { lexer.NextToken(); -#line 2412 "VBNET.ATG" +#line 2419 "VBNET.ATG" ExitType exitType = ExitType.None; switch (la.kind) { case 167: { lexer.NextToken(); -#line 2414 "VBNET.ATG" +#line 2421 "VBNET.ATG" exitType = ExitType.Sub; break; } case 100: { lexer.NextToken(); -#line 2416 "VBNET.ATG" +#line 2423 "VBNET.ATG" exitType = ExitType.Function; break; } case 146: { lexer.NextToken(); -#line 2418 "VBNET.ATG" +#line 2425 "VBNET.ATG" exitType = ExitType.Property; break; } case 83: { lexer.NextToken(); -#line 2420 "VBNET.ATG" +#line 2427 "VBNET.ATG" exitType = ExitType.Do; break; } case 98: { lexer.NextToken(); -#line 2422 "VBNET.ATG" +#line 2429 "VBNET.ATG" exitType = ExitType.For; break; } case 174: { lexer.NextToken(); -#line 2424 "VBNET.ATG" +#line 2431 "VBNET.ATG" exitType = ExitType.Try; break; } case 181: { lexer.NextToken(); -#line 2426 "VBNET.ATG" +#line 2433 "VBNET.ATG" exitType = ExitType.While; break; } case 155: { lexer.NextToken(); -#line 2428 "VBNET.ATG" +#line 2435 "VBNET.ATG" exitType = ExitType.Select; break; } default: SynErr(252); break; } -#line 2430 "VBNET.ATG" +#line 2437 "VBNET.ATG" statement = new ExitStatement(exitType); break; } case 174: { TryStatement( -#line 2431 "VBNET.ATG" +#line 2438 "VBNET.ATG" out statement); break; } case 186: { lexer.NextToken(); -#line 2432 "VBNET.ATG" +#line 2439 "VBNET.ATG" ContinueType continueType = ContinueType.None; if (la.kind == 83 || la.kind == 98 || la.kind == 181) { if (la.kind == 83) { lexer.NextToken(); -#line 2432 "VBNET.ATG" +#line 2439 "VBNET.ATG" continueType = ContinueType.Do; } else if (la.kind == 98) { lexer.NextToken(); -#line 2432 "VBNET.ATG" +#line 2439 "VBNET.ATG" continueType = ContinueType.For; } else { lexer.NextToken(); -#line 2432 "VBNET.ATG" +#line 2439 "VBNET.ATG" continueType = ContinueType.While; } } -#line 2432 "VBNET.ATG" +#line 2439 "VBNET.ATG" statement = new ContinueStatement(continueType); break; } @@ -5038,11 +5053,11 @@ out statement); lexer.NextToken(); if (StartOf(21)) { Expr( -#line 2434 "VBNET.ATG" +#line 2441 "VBNET.ATG" out expr); } -#line 2434 "VBNET.ATG" +#line 2441 "VBNET.ATG" statement = new ThrowStatement(expr); break; } @@ -5050,27 +5065,27 @@ out expr); lexer.NextToken(); if (StartOf(21)) { Expr( -#line 2436 "VBNET.ATG" +#line 2443 "VBNET.ATG" out expr); } -#line 2436 "VBNET.ATG" +#line 2443 "VBNET.ATG" statement = new ReturnStatement(expr); break; } case 168: { lexer.NextToken(); Expr( -#line 2438 "VBNET.ATG" +#line 2445 "VBNET.ATG" out expr); EndOfStmt(); Block( -#line 2438 "VBNET.ATG" +#line 2445 "VBNET.ATG" out embeddedStatement); Expect(88); Expect(168); -#line 2439 "VBNET.ATG" +#line 2446 "VBNET.ATG" statement = new LockStatement(expr, embeddedStatement); break; } @@ -5078,42 +5093,42 @@ out embeddedStatement); lexer.NextToken(); Identifier(); -#line 2441 "VBNET.ATG" +#line 2448 "VBNET.ATG" name = t.val; if (la.kind == 24) { lexer.NextToken(); if (StartOf(20)) { ArgumentList( -#line 2442 "VBNET.ATG" +#line 2449 "VBNET.ATG" out p); } Expect(25); } -#line 2443 "VBNET.ATG" +#line 2450 "VBNET.ATG" statement = new RaiseEventStatement(name, p); break; } case 182: { WithStatement( -#line 2445 "VBNET.ATG" +#line 2452 "VBNET.ATG" out statement); break; } case 42: { lexer.NextToken(); -#line 2447 "VBNET.ATG" +#line 2454 "VBNET.ATG" Expression handlerExpr = null; Expr( -#line 2448 "VBNET.ATG" +#line 2455 "VBNET.ATG" out expr); Expect(12); Expr( -#line 2448 "VBNET.ATG" +#line 2455 "VBNET.ATG" out handlerExpr); -#line 2450 "VBNET.ATG" +#line 2457 "VBNET.ATG" statement = new AddHandlerStatement(expr, handlerExpr); break; @@ -5121,17 +5136,17 @@ out handlerExpr); case 152: { lexer.NextToken(); -#line 2453 "VBNET.ATG" +#line 2460 "VBNET.ATG" Expression handlerExpr = null; Expr( -#line 2454 "VBNET.ATG" +#line 2461 "VBNET.ATG" out expr); Expect(12); Expr( -#line 2454 "VBNET.ATG" +#line 2461 "VBNET.ATG" out handlerExpr); -#line 2456 "VBNET.ATG" +#line 2463 "VBNET.ATG" statement = new RemoveHandlerStatement(expr, handlerExpr); break; @@ -5139,16 +5154,16 @@ out handlerExpr); case 181: { lexer.NextToken(); Expr( -#line 2459 "VBNET.ATG" +#line 2466 "VBNET.ATG" out expr); EndOfStmt(); Block( -#line 2460 "VBNET.ATG" +#line 2467 "VBNET.ATG" out embeddedStatement); Expect(88); Expect(181); -#line 2462 "VBNET.ATG" +#line 2469 "VBNET.ATG" statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.Start); break; @@ -5156,23 +5171,23 @@ out embeddedStatement); case 83: { lexer.NextToken(); -#line 2467 "VBNET.ATG" +#line 2474 "VBNET.ATG" ConditionType conditionType = ConditionType.None; if (la.kind == 177 || la.kind == 181) { WhileOrUntil( -#line 2470 "VBNET.ATG" +#line 2477 "VBNET.ATG" out conditionType); Expr( -#line 2470 "VBNET.ATG" +#line 2477 "VBNET.ATG" out expr); EndOfStmt(); Block( -#line 2471 "VBNET.ATG" +#line 2478 "VBNET.ATG" out embeddedStatement); Expect(118); -#line 2474 "VBNET.ATG" +#line 2481 "VBNET.ATG" statement = new DoLoopStatement(expr, embeddedStatement, conditionType == ConditionType.While ? ConditionType.DoWhile : conditionType, @@ -5181,19 +5196,19 @@ out embeddedStatement); } else if (la.kind == 1 || la.kind == 13) { EndOfStmt(); Block( -#line 2481 "VBNET.ATG" +#line 2488 "VBNET.ATG" out embeddedStatement); Expect(118); if (la.kind == 177 || la.kind == 181) { WhileOrUntil( -#line 2482 "VBNET.ATG" +#line 2489 "VBNET.ATG" out conditionType); Expr( -#line 2482 "VBNET.ATG" +#line 2489 "VBNET.ATG" out expr); } -#line 2484 "VBNET.ATG" +#line 2491 "VBNET.ATG" statement = new DoLoopStatement(expr, embeddedStatement, conditionType, ConditionPosition.End); } else SynErr(253); @@ -5202,7 +5217,7 @@ out expr); case 98: { lexer.NextToken(); -#line 2489 "VBNET.ATG" +#line 2496 "VBNET.ATG" Expression group = null; TypeReference typeReference; string typeName; @@ -5211,24 +5226,24 @@ out expr); if (la.kind == 85) { lexer.NextToken(); LoopControlVariable( -#line 2496 "VBNET.ATG" +#line 2503 "VBNET.ATG" out typeReference, out typeName); Expect(109); Expr( -#line 2497 "VBNET.ATG" +#line 2504 "VBNET.ATG" out group); EndOfStmt(); Block( -#line 2498 "VBNET.ATG" +#line 2505 "VBNET.ATG" out embeddedStatement); Expect(128); if (StartOf(21)) { Expr( -#line 2499 "VBNET.ATG" +#line 2506 "VBNET.ATG" out expr); } -#line 2501 "VBNET.ATG" +#line 2508 "VBNET.ATG" statement = new ForeachStatement(typeReference, typeName, group, @@ -5240,53 +5255,53 @@ out expr); } else if (StartOf(12)) { -#line 2512 "VBNET.ATG" +#line 2519 "VBNET.ATG" Expression start = null; Expression end = null; Expression step = null; Expression nextExpr = null;List nextExpressions = null; LoopControlVariable( -#line 2517 "VBNET.ATG" +#line 2524 "VBNET.ATG" out typeReference, out typeName); Expect(11); Expr( -#line 2518 "VBNET.ATG" +#line 2525 "VBNET.ATG" out start); Expect(172); Expr( -#line 2518 "VBNET.ATG" +#line 2525 "VBNET.ATG" out end); if (la.kind == 162) { lexer.NextToken(); Expr( -#line 2518 "VBNET.ATG" +#line 2525 "VBNET.ATG" out step); } EndOfStmt(); Block( -#line 2519 "VBNET.ATG" +#line 2526 "VBNET.ATG" out embeddedStatement); Expect(128); if (StartOf(21)) { Expr( -#line 2522 "VBNET.ATG" +#line 2529 "VBNET.ATG" out nextExpr); -#line 2522 "VBNET.ATG" +#line 2529 "VBNET.ATG" nextExpressions = new List(); nextExpressions.Add(nextExpr); while (la.kind == 12) { lexer.NextToken(); Expr( -#line 2523 "VBNET.ATG" +#line 2530 "VBNET.ATG" out nextExpr); -#line 2523 "VBNET.ATG" +#line 2530 "VBNET.ATG" nextExpressions.Add(nextExpr); } } -#line 2526 "VBNET.ATG" +#line 2533 "VBNET.ATG" statement = new ForNextStatement(typeReference, typeName, start, end, step, embeddedStatement, nextExpressions); } else SynErr(254); @@ -5295,29 +5310,29 @@ out nextExpr); case 92: { lexer.NextToken(); Expr( -#line 2530 "VBNET.ATG" +#line 2537 "VBNET.ATG" out expr); -#line 2530 "VBNET.ATG" +#line 2537 "VBNET.ATG" statement = new ErrorStatement(expr); break; } case 151: { lexer.NextToken(); -#line 2532 "VBNET.ATG" +#line 2539 "VBNET.ATG" bool isPreserve = false; if (la.kind == 144) { lexer.NextToken(); -#line 2532 "VBNET.ATG" +#line 2539 "VBNET.ATG" isPreserve = true; } Expr( -#line 2533 "VBNET.ATG" +#line 2540 "VBNET.ATG" out expr); -#line 2535 "VBNET.ATG" +#line 2542 "VBNET.ATG" ReDimStatement reDimStatement = new ReDimStatement(isPreserve); statement = reDimStatement; InvocationExpression redimClause = expr as InvocationExpression; @@ -5326,13 +5341,13 @@ out expr); while (la.kind == 12) { lexer.NextToken(); Expr( -#line 2540 "VBNET.ATG" +#line 2547 "VBNET.ATG" out expr); -#line 2541 "VBNET.ATG" +#line 2548 "VBNET.ATG" redimClause = expr as InvocationExpression; -#line 2542 "VBNET.ATG" +#line 2549 "VBNET.ATG" if (redimClause != null) { reDimStatement.ReDimClauses.Add(redimClause); } } break; @@ -5340,10 +5355,10 @@ out expr); case 91: { lexer.NextToken(); Expr( -#line 2546 "VBNET.ATG" +#line 2553 "VBNET.ATG" out expr); -#line 2547 "VBNET.ATG" +#line 2554 "VBNET.ATG" List arrays = new List(); if (expr != null) { arrays.Add(expr);} EraseStatement eraseStatement = new EraseStatement(arrays); @@ -5352,53 +5367,53 @@ out expr); while (la.kind == 12) { lexer.NextToken(); Expr( -#line 2552 "VBNET.ATG" +#line 2559 "VBNET.ATG" out expr); -#line 2552 "VBNET.ATG" +#line 2559 "VBNET.ATG" if (expr != null) { arrays.Add(expr); } } -#line 2553 "VBNET.ATG" +#line 2560 "VBNET.ATG" statement = eraseStatement; break; } case 163: { lexer.NextToken(); -#line 2555 "VBNET.ATG" +#line 2562 "VBNET.ATG" statement = new StopStatement(); break; } case 106: { lexer.NextToken(); Expr( -#line 2557 "VBNET.ATG" +#line 2564 "VBNET.ATG" out expr); if (la.kind == 170) { lexer.NextToken(); } if ( -#line 2559 "VBNET.ATG" +#line 2566 "VBNET.ATG" IsEndStmtAhead()) { Expect(88); -#line 2559 "VBNET.ATG" +#line 2566 "VBNET.ATG" statement = new IfElseStatement(expr, new EndStatement()); } else if (la.kind == 1 || la.kind == 13) { EndOfStmt(); Block( -#line 2562 "VBNET.ATG" +#line 2569 "VBNET.ATG" out embeddedStatement); -#line 2564 "VBNET.ATG" +#line 2571 "VBNET.ATG" IfElseStatement ifStatement = new IfElseStatement(expr, embeddedStatement); while (la.kind == 87 || -#line 2568 "VBNET.ATG" +#line 2575 "VBNET.ATG" IsElseIf()) { if ( -#line 2568 "VBNET.ATG" +#line 2575 "VBNET.ATG" IsElseIf()) { Expect(86); Expect(106); @@ -5406,20 +5421,20 @@ IsElseIf()) { lexer.NextToken(); } -#line 2571 "VBNET.ATG" +#line 2578 "VBNET.ATG" Expression condition = null; Statement block = null; Expr( -#line 2572 "VBNET.ATG" +#line 2579 "VBNET.ATG" out condition); if (la.kind == 170) { lexer.NextToken(); } EndOfStmt(); Block( -#line 2573 "VBNET.ATG" +#line 2580 "VBNET.ATG" out block); -#line 2575 "VBNET.ATG" +#line 2582 "VBNET.ATG" ifStatement.ElseIfSections.Add(new ElseIfSection(condition, block)); } @@ -5427,59 +5442,59 @@ out block); lexer.NextToken(); EndOfStmt(); Block( -#line 2580 "VBNET.ATG" +#line 2587 "VBNET.ATG" out embeddedStatement); -#line 2582 "VBNET.ATG" +#line 2589 "VBNET.ATG" ifStatement.FalseStatement.Add(embeddedStatement); } Expect(88); Expect(106); -#line 2586 "VBNET.ATG" +#line 2593 "VBNET.ATG" statement = ifStatement; } else if (StartOf(26)) { EmbeddedStatement( -#line 2589 "VBNET.ATG" +#line 2596 "VBNET.ATG" out embeddedStatement); -#line 2591 "VBNET.ATG" +#line 2598 "VBNET.ATG" IfElseStatement ifStatement = new IfElseStatement(expr, embeddedStatement); while (la.kind == 13) { lexer.NextToken(); EmbeddedStatement( -#line 2593 "VBNET.ATG" +#line 2600 "VBNET.ATG" out embeddedStatement); -#line 2593 "VBNET.ATG" +#line 2600 "VBNET.ATG" ifStatement.TrueStatement.Add(embeddedStatement); } if (la.kind == 86) { lexer.NextToken(); if (StartOf(26)) { EmbeddedStatement( -#line 2595 "VBNET.ATG" +#line 2602 "VBNET.ATG" out embeddedStatement); } -#line 2597 "VBNET.ATG" +#line 2604 "VBNET.ATG" ifStatement.FalseStatement.Add(embeddedStatement); while (la.kind == 13) { lexer.NextToken(); EmbeddedStatement( -#line 2600 "VBNET.ATG" +#line 2607 "VBNET.ATG" out embeddedStatement); -#line 2601 "VBNET.ATG" +#line 2608 "VBNET.ATG" ifStatement.FalseStatement.Add(embeddedStatement); } } -#line 2604 "VBNET.ATG" +#line 2611 "VBNET.ATG" statement = ifStatement; } else SynErr(255); break; @@ -5490,43 +5505,43 @@ out embeddedStatement); lexer.NextToken(); } Expr( -#line 2607 "VBNET.ATG" +#line 2614 "VBNET.ATG" out expr); EndOfStmt(); -#line 2608 "VBNET.ATG" +#line 2615 "VBNET.ATG" List selectSections = new List(); Statement block = null; while (la.kind == 57) { -#line 2612 "VBNET.ATG" +#line 2619 "VBNET.ATG" List caseClauses = null; lexer.NextToken(); CaseClauses( -#line 2613 "VBNET.ATG" +#line 2620 "VBNET.ATG" out caseClauses); if ( -#line 2613 "VBNET.ATG" +#line 2620 "VBNET.ATG" IsNotStatementSeparator()) { lexer.NextToken(); } EndOfStmt(); -#line 2615 "VBNET.ATG" +#line 2622 "VBNET.ATG" SwitchSection selectSection = new SwitchSection(caseClauses); Block( -#line 2617 "VBNET.ATG" +#line 2624 "VBNET.ATG" out block); -#line 2619 "VBNET.ATG" +#line 2626 "VBNET.ATG" selectSection.Children = block.Children; selectSections.Add(selectSection); } -#line 2623 "VBNET.ATG" +#line 2630 "VBNET.ATG" statement = new SwitchStatement(expr, selectSections); Expect(88); Expect(155); @@ -5534,43 +5549,43 @@ out block); } case 135: { -#line 2625 "VBNET.ATG" +#line 2632 "VBNET.ATG" OnErrorStatement onErrorStatement = null; OnErrorStatement( -#line 2626 "VBNET.ATG" +#line 2633 "VBNET.ATG" out onErrorStatement); -#line 2626 "VBNET.ATG" +#line 2633 "VBNET.ATG" statement = onErrorStatement; break; } case 104: { -#line 2627 "VBNET.ATG" +#line 2634 "VBNET.ATG" GotoStatement goToStatement = null; GotoStatement( -#line 2628 "VBNET.ATG" +#line 2635 "VBNET.ATG" out goToStatement); -#line 2628 "VBNET.ATG" +#line 2635 "VBNET.ATG" statement = goToStatement; break; } case 153: { -#line 2629 "VBNET.ATG" +#line 2636 "VBNET.ATG" ResumeStatement resumeStatement = null; ResumeStatement( -#line 2630 "VBNET.ATG" +#line 2637 "VBNET.ATG" out resumeStatement); -#line 2630 "VBNET.ATG" +#line 2637 "VBNET.ATG" statement = resumeStatement; break; } case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 24: case 43: case 47: case 49: case 50: case 51: case 52: case 54: case 59: case 60: case 61: case 62: case 63: case 64: case 65: case 66: case 68: case 69: case 70: case 72: case 73: case 74: case 75: case 76: case 77: case 82: case 84: case 96: case 102: case 111: case 117: case 119: case 124: case 125: case 127: case 130: case 144: case 159: case 160: case 165: case 169: case 173: case 175: case 176: case 177: case 190: case 191: case 192: case 193: case 194: case 195: case 196: case 197: case 198: case 199: { -#line 2633 "VBNET.ATG" +#line 2640 "VBNET.ATG" Expression val = null; AssignmentOperatorType op; @@ -5578,25 +5593,25 @@ out resumeStatement); la.kind == Tokens.Not || la.kind == Tokens.Times; SimpleExpr( -#line 2639 "VBNET.ATG" +#line 2646 "VBNET.ATG" out expr); if (StartOf(28)) { AssignmentOperator( -#line 2641 "VBNET.ATG" +#line 2648 "VBNET.ATG" out op); Expr( -#line 2641 "VBNET.ATG" +#line 2648 "VBNET.ATG" out val); -#line 2641 "VBNET.ATG" +#line 2648 "VBNET.ATG" expr = new AssignmentExpression(expr, op, val); } else if (la.kind == 1 || la.kind == 13 || la.kind == 86) { -#line 2642 "VBNET.ATG" +#line 2649 "VBNET.ATG" if (mustBeAssignment) Error("error in assignment."); } else SynErr(256); -#line 2645 "VBNET.ATG" +#line 2652 "VBNET.ATG" // a field reference expression that stands alone is a // invocation expression without parantheses and arguments if(expr is FieldReferenceExpression || expr is IdentifierExpression) { @@ -5609,10 +5624,10 @@ out val); case 56: { lexer.NextToken(); SimpleExpr( -#line 2652 "VBNET.ATG" +#line 2659 "VBNET.ATG" out expr); -#line 2652 "VBNET.ATG" +#line 2659 "VBNET.ATG" statement = new StatementExpression(expr); break; } @@ -5620,7 +5635,7 @@ out expr); lexer.NextToken(); Identifier(); -#line 2654 "VBNET.ATG" +#line 2661 "VBNET.ATG" string resourcename = t.val, typeName; Statement resourceAquisition = null, block = null; @@ -5628,45 +5643,45 @@ out expr); if (la.kind == 127) { lexer.NextToken(); Qualident( -#line 2657 "VBNET.ATG" +#line 2664 "VBNET.ATG" out typeName); -#line 2658 "VBNET.ATG" +#line 2665 "VBNET.ATG" List initializer = null; if (la.kind == 24) { lexer.NextToken(); if (StartOf(20)) { ArgumentList( -#line 2659 "VBNET.ATG" +#line 2666 "VBNET.ATG" out initializer); } Expect(25); } -#line 2661 "VBNET.ATG" +#line 2668 "VBNET.ATG" resourceAquisition = new LocalVariableDeclaration(new VariableDeclaration(resourcename, new ArrayInitializerExpression(initializer), new TypeReference(typeName))); } else if (StartOf(12)) { Qualident( -#line 2664 "VBNET.ATG" +#line 2671 "VBNET.ATG" out typeName); Expect(11); Expr( -#line 2664 "VBNET.ATG" +#line 2671 "VBNET.ATG" out expr); -#line 2666 "VBNET.ATG" +#line 2673 "VBNET.ATG" resourceAquisition = new LocalVariableDeclaration(new VariableDeclaration(resourcename, expr, new TypeReference(typeName))); } else SynErr(257); Block( -#line 2669 "VBNET.ATG" +#line 2676 "VBNET.ATG" out block); Expect(88); Expect(188); -#line 2671 "VBNET.ATG" +#line 2678 "VBNET.ATG" statement = new UsingStatement(resourceAquisition, block); break; } @@ -5675,10 +5690,10 @@ out block); } void LocalDeclarationStatement( -#line 2373 "VBNET.ATG" +#line 2380 "VBNET.ATG" out Statement statement) { -#line 2375 "VBNET.ATG" +#line 2382 "VBNET.ATG" Modifiers m = new Modifiers(); LocalVariableDeclaration localVariableDeclaration; bool dimfound = false; @@ -5687,22 +5702,22 @@ out Statement statement) { if (la.kind == 71) { lexer.NextToken(); -#line 2381 "VBNET.ATG" +#line 2388 "VBNET.ATG" m.Add(Modifier.Const, t.Location); } else if (la.kind == 161) { lexer.NextToken(); -#line 2382 "VBNET.ATG" +#line 2389 "VBNET.ATG" m.Add(Modifier.Static, t.Location); } else { lexer.NextToken(); -#line 2383 "VBNET.ATG" +#line 2390 "VBNET.ATG" dimfound = true; } } -#line 2386 "VBNET.ATG" +#line 2393 "VBNET.ATG" if(dimfound && (m.Modifier & Modifier.Const) != 0) { Error("Dim is not allowed on constants."); } @@ -5715,137 +5730,137 @@ out Statement statement) { localVariableDeclaration.StartLocation = t.Location; VariableDeclarator( -#line 2397 "VBNET.ATG" +#line 2404 "VBNET.ATG" localVariableDeclaration.Variables); while (la.kind == 12) { lexer.NextToken(); VariableDeclarator( -#line 2398 "VBNET.ATG" +#line 2405 "VBNET.ATG" localVariableDeclaration.Variables); } -#line 2400 "VBNET.ATG" +#line 2407 "VBNET.ATG" statement = localVariableDeclaration; } void TryStatement( -#line 2864 "VBNET.ATG" +#line 2871 "VBNET.ATG" out Statement tryStatement) { -#line 2866 "VBNET.ATG" +#line 2873 "VBNET.ATG" Statement blockStmt = null, finallyStmt = null;List catchClauses = null; Expect(174); EndOfStmt(); Block( -#line 2869 "VBNET.ATG" +#line 2876 "VBNET.ATG" out blockStmt); if (la.kind == 58 || la.kind == 88 || la.kind == 97) { CatchClauses( -#line 2870 "VBNET.ATG" +#line 2877 "VBNET.ATG" out catchClauses); } if (la.kind == 97) { lexer.NextToken(); EndOfStmt(); Block( -#line 2871 "VBNET.ATG" +#line 2878 "VBNET.ATG" out finallyStmt); } Expect(88); Expect(174); -#line 2874 "VBNET.ATG" +#line 2881 "VBNET.ATG" tryStatement = new TryCatchStatement(blockStmt, catchClauses, finallyStmt); } void WithStatement( -#line 2842 "VBNET.ATG" +#line 2849 "VBNET.ATG" out Statement withStatement) { -#line 2844 "VBNET.ATG" +#line 2851 "VBNET.ATG" Statement blockStmt = null; Expression expr = null; Expect(182); -#line 2847 "VBNET.ATG" +#line 2854 "VBNET.ATG" Point start = t.Location; Expr( -#line 2848 "VBNET.ATG" +#line 2855 "VBNET.ATG" out expr); EndOfStmt(); -#line 2850 "VBNET.ATG" +#line 2857 "VBNET.ATG" withStatement = new WithStatement(expr); withStatement.StartLocation = start; withStatements.Push(withStatement); Block( -#line 2854 "VBNET.ATG" +#line 2861 "VBNET.ATG" out blockStmt); -#line 2856 "VBNET.ATG" +#line 2863 "VBNET.ATG" ((WithStatement)withStatement).Body = (BlockStatement)blockStmt; withStatements.Pop(); Expect(88); Expect(182); -#line 2860 "VBNET.ATG" +#line 2867 "VBNET.ATG" withStatement.EndLocation = t.Location; } void WhileOrUntil( -#line 2835 "VBNET.ATG" +#line 2842 "VBNET.ATG" out ConditionType conditionType) { -#line 2836 "VBNET.ATG" +#line 2843 "VBNET.ATG" conditionType = ConditionType.None; if (la.kind == 181) { lexer.NextToken(); -#line 2837 "VBNET.ATG" +#line 2844 "VBNET.ATG" conditionType = ConditionType.While; } else if (la.kind == 177) { lexer.NextToken(); -#line 2838 "VBNET.ATG" +#line 2845 "VBNET.ATG" conditionType = ConditionType.Until; } else SynErr(259); } void LoopControlVariable( -#line 2676 "VBNET.ATG" +#line 2683 "VBNET.ATG" out TypeReference type, out string name) { -#line 2677 "VBNET.ATG" +#line 2684 "VBNET.ATG" ArrayList arrayModifiers = null; type = null; Qualident( -#line 2681 "VBNET.ATG" +#line 2688 "VBNET.ATG" out name); if ( -#line 2682 "VBNET.ATG" +#line 2689 "VBNET.ATG" IsDims()) { ArrayTypeModifiers( -#line 2682 "VBNET.ATG" +#line 2689 "VBNET.ATG" out arrayModifiers); } if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 2683 "VBNET.ATG" +#line 2690 "VBNET.ATG" out type); -#line 2683 "VBNET.ATG" +#line 2690 "VBNET.ATG" if (name.IndexOf('.') > 0) { Error("No type def for 'for each' member indexer allowed."); } } -#line 2685 "VBNET.ATG" +#line 2692 "VBNET.ATG" if (type != null) { if(type.RankSpecifier != null && arrayModifiers != null) { Error("array rank only allowed one time"); @@ -5863,48 +5878,48 @@ out type); } void CaseClauses( -#line 2795 "VBNET.ATG" +#line 2802 "VBNET.ATG" out List caseClauses) { -#line 2797 "VBNET.ATG" +#line 2804 "VBNET.ATG" caseClauses = new List(); CaseLabel caseClause = null; CaseClause( -#line 2800 "VBNET.ATG" +#line 2807 "VBNET.ATG" out caseClause); -#line 2800 "VBNET.ATG" +#line 2807 "VBNET.ATG" if (caseClause != null) { caseClauses.Add(caseClause); } while (la.kind == 12) { lexer.NextToken(); CaseClause( -#line 2801 "VBNET.ATG" +#line 2808 "VBNET.ATG" out caseClause); -#line 2801 "VBNET.ATG" +#line 2808 "VBNET.ATG" if (caseClause != null) { caseClauses.Add(caseClause); } } } void OnErrorStatement( -#line 2702 "VBNET.ATG" +#line 2709 "VBNET.ATG" out OnErrorStatement stmt) { -#line 2704 "VBNET.ATG" +#line 2711 "VBNET.ATG" stmt = null; GotoStatement goToStatement = null; Expect(135); Expect(92); if ( -#line 2710 "VBNET.ATG" +#line 2717 "VBNET.ATG" IsNegativeLabelName()) { Expect(104); Expect(15); Expect(5); -#line 2712 "VBNET.ATG" +#line 2719 "VBNET.ATG" long intLabel = Int64.Parse(t.val); if(intLabel != 1) { Error("invalid label in on error statement."); @@ -5913,10 +5928,10 @@ IsNegativeLabelName()) { } else if (la.kind == 104) { GotoStatement( -#line 2718 "VBNET.ATG" +#line 2725 "VBNET.ATG" out goToStatement); -#line 2720 "VBNET.ATG" +#line 2727 "VBNET.ATG" string val = goToStatement.Label; // if value is numeric, make sure that is 0 @@ -5933,63 +5948,63 @@ out goToStatement); lexer.NextToken(); Expect(128); -#line 2734 "VBNET.ATG" +#line 2741 "VBNET.ATG" stmt = new OnErrorStatement(new ResumeStatement(true)); } else SynErr(260); } void GotoStatement( -#line 2740 "VBNET.ATG" +#line 2747 "VBNET.ATG" out ICSharpCode.NRefactory.Parser.AST.GotoStatement goToStatement) { -#line 2742 "VBNET.ATG" +#line 2749 "VBNET.ATG" string label = String.Empty; Expect(104); LabelName( -#line 2745 "VBNET.ATG" +#line 2752 "VBNET.ATG" out label); -#line 2747 "VBNET.ATG" +#line 2754 "VBNET.ATG" goToStatement = new ICSharpCode.NRefactory.Parser.AST.GotoStatement(label); } void ResumeStatement( -#line 2784 "VBNET.ATG" +#line 2791 "VBNET.ATG" out ResumeStatement resumeStatement) { -#line 2786 "VBNET.ATG" +#line 2793 "VBNET.ATG" resumeStatement = null; string label = String.Empty; if ( -#line 2789 "VBNET.ATG" +#line 2796 "VBNET.ATG" IsResumeNext()) { Expect(153); Expect(128); -#line 2790 "VBNET.ATG" +#line 2797 "VBNET.ATG" resumeStatement = new ResumeStatement(true); } else if (la.kind == 153) { lexer.NextToken(); if (StartOf(29)) { LabelName( -#line 2791 "VBNET.ATG" +#line 2798 "VBNET.ATG" out label); } -#line 2791 "VBNET.ATG" +#line 2798 "VBNET.ATG" resumeStatement = new ResumeStatement(label); } else SynErr(261); } void CaseClause( -#line 2805 "VBNET.ATG" +#line 2812 "VBNET.ATG" out CaseLabel caseClause) { -#line 2807 "VBNET.ATG" +#line 2814 "VBNET.ATG" Expression expr = null; Expression sexpr = null; BinaryOperatorType op = BinaryOperatorType.None; @@ -5998,7 +6013,7 @@ out CaseLabel caseClause) { if (la.kind == 86) { lexer.NextToken(); -#line 2813 "VBNET.ATG" +#line 2820 "VBNET.ATG" caseClause = new CaseLabel(); } else if (StartOf(30)) { if (la.kind == 113) { @@ -6008,76 +6023,76 @@ out CaseLabel caseClause) { case 27: { lexer.NextToken(); -#line 2817 "VBNET.ATG" +#line 2824 "VBNET.ATG" op = BinaryOperatorType.LessThan; break; } case 26: { lexer.NextToken(); -#line 2818 "VBNET.ATG" +#line 2825 "VBNET.ATG" op = BinaryOperatorType.GreaterThan; break; } case 30: { lexer.NextToken(); -#line 2819 "VBNET.ATG" +#line 2826 "VBNET.ATG" op = BinaryOperatorType.LessThanOrEqual; break; } case 29: { lexer.NextToken(); -#line 2820 "VBNET.ATG" +#line 2827 "VBNET.ATG" op = BinaryOperatorType.GreaterThanOrEqual; break; } case 11: { lexer.NextToken(); -#line 2821 "VBNET.ATG" +#line 2828 "VBNET.ATG" op = BinaryOperatorType.Equality; break; } case 28: { lexer.NextToken(); -#line 2822 "VBNET.ATG" +#line 2829 "VBNET.ATG" op = BinaryOperatorType.InEquality; break; } default: SynErr(262); break; } Expr( -#line 2824 "VBNET.ATG" +#line 2831 "VBNET.ATG" out expr); -#line 2826 "VBNET.ATG" +#line 2833 "VBNET.ATG" caseClause = new CaseLabel(op, expr); } else if (StartOf(21)) { Expr( -#line 2828 "VBNET.ATG" +#line 2835 "VBNET.ATG" out expr); if (la.kind == 172) { lexer.NextToken(); Expr( -#line 2828 "VBNET.ATG" +#line 2835 "VBNET.ATG" out sexpr); } -#line 2830 "VBNET.ATG" +#line 2837 "VBNET.ATG" caseClause = new CaseLabel(expr, sexpr); } else SynErr(263); } void CatchClauses( -#line 2879 "VBNET.ATG" +#line 2886 "VBNET.ATG" out List catchClauses) { -#line 2881 "VBNET.ATG" +#line 2888 "VBNET.ATG" catchClauses = new List(); TypeReference type = null; Statement blockStmt = null; @@ -6089,27 +6104,27 @@ out List catchClauses) { if (StartOf(12)) { Identifier(); -#line 2889 "VBNET.ATG" +#line 2896 "VBNET.ATG" name = t.val; if (la.kind == 48) { lexer.NextToken(); TypeName( -#line 2889 "VBNET.ATG" +#line 2896 "VBNET.ATG" out type); } } if (la.kind == 180) { lexer.NextToken(); Expr( -#line 2890 "VBNET.ATG" +#line 2897 "VBNET.ATG" out expr); } EndOfStmt(); Block( -#line 2892 "VBNET.ATG" +#line 2899 "VBNET.ATG" out blockStmt); -#line 2893 "VBNET.ATG" +#line 2900 "VBNET.ATG" catchClauses.Add(new CatchClause(type, name, blockStmt, expr)); } } diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG index 9eae7cb3b5..51c2d292fe 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG @@ -662,6 +662,7 @@ NonModuleDeclaration attributes> Identifier (. newType.Name = t.val; .) TypeParameterList EndOfStmt + (. newType.BodyStartLocation = t.Location; .) [ ClassBaseType (. newType.BaseTypes.Add(typeRef); .) ] { TypeImplementsClause (. newType.BaseTypes.AddRange(baseInterfaces); .) } ClassBody @@ -679,6 +680,7 @@ NonModuleDeclaration attributes> .) Identifier (. newType.Name = t.val; .) EOL + (. newType.BodyStartLocation = t.Location; .) ModuleBody (. compilationUnit.BlockEnd(); @@ -694,7 +696,9 @@ NonModuleDeclaration attributes> .) Identifier (. newType.Name = t.val; .) TypeParameterList - EOL { TypeImplementsClause (. newType.BaseTypes.AddRange(baseInterfaces);.) } + EOL + (. newType.BodyStartLocation = t.Location; .) + { TypeImplementsClause (. newType.BaseTypes.AddRange(baseInterfaces);.) } StructureBody (. compilationUnit.BlockEnd(); @@ -713,6 +717,7 @@ NonModuleDeclaration attributes> Identifier (. newType.Name = t.val; .) [ "As" NonArrayTypeName (. newType.BaseTypes.Add(typeRef); .) ] EOL + (. newType.BodyStartLocation = t.Location; .) EnumBody (. compilationUnit.BlockEnd(); @@ -729,7 +734,9 @@ NonModuleDeclaration attributes> .) Identifier (. newType.Name = t.val; .) TypeParameterList - EndOfStmt { InterfaceBase (. newType.BaseTypes.AddRange(baseInterfaces); .) } + EndOfStmt + (. newType.BodyStartLocation = t.Location; .) + { InterfaceBase (. newType.BaseTypes.AddRange(baseInterfaces); .) } InterfaceBody (. compilationUnit.BlockEnd(); diff --git a/src/Libraries/NRefactory/Project/Src/Parser/gen.bat b/src/Libraries/NRefactory/Project/Src/Parser/gen.bat index f1069be016..b6d6e0caa3 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/gen.bat +++ b/src/Libraries/NRefactory/Project/Src/Parser/gen.bat @@ -35,3 +35,5 @@ del VBNET.ATG :exit pause cd .. +cd ..\..\.. +%windir%\microsoft.net\framework\v2.0.50727\msbuild diff --git a/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs b/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs index 2332109562..df06e9bb80 100644 --- a/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs @@ -32,7 +32,19 @@ namespace ICSharpCode.NRefactory.Tests.AST } [Test] - public void CSharpSimplePartitialClassTypeDeclarationTest() + public void CSharpSimpleClassRegionTest() + { + const string program = "class MyClass\n{\n}\n"; + TypeDeclaration td = ParseUtilCSharp.ParseGlobal(program); + Assert.AreEqual(1, td.StartLocation.Y, "StartLocation.Y"); + Assert.AreEqual(1, td.StartLocation.X, "StartLocation.X"); + Assert.AreEqual(1, td.BodyStartLocation.Y, "BodyStartLocation.Y"); + Assert.AreEqual(14, td.BodyStartLocation.X, "BodyStartLocation.X"); + Assert.AreEqual(3, td.EndLocation.Y, "EndLocation.Y"); + } + + [Test] + public void CSharpSimplePartialClassTypeDeclarationTest() { TypeDeclaration td = ParseUtilCSharp.ParseGlobal("partial class MyClass { }"); Assert.IsNotNull(td); @@ -184,6 +196,8 @@ public abstract class MyClass : MyBase, Interface1, My.Test.Interface2 Assert.AreEqual("TestClass", td.Name); Assert.AreEqual(ClassType.Class, td.Type); Assert.AreEqual(1, td.StartLocation.Y, "start line"); + Assert.AreEqual(1, td.BodyStartLocation.Y, "bodystart line"); + Assert.AreEqual(16, td.BodyStartLocation.X, "bodystart col"); Assert.AreEqual(2, td.EndLocation.Y, "end line"); } diff --git a/src/Main/Base/Project/Src/Dom/IClass.cs b/src/Main/Base/Project/Src/Dom/IClass.cs index 1a60f3c83b..a3f08a4679 100644 --- a/src/Main/Base/Project/Src/Dom/IClass.cs +++ b/src/Main/Base/Project/Src/Dom/IClass.cs @@ -55,10 +55,17 @@ namespace ICSharpCode.SharpDevelop.Dom get; } + /// + /// Region of the whole class including the body. + /// DomRegion Region { get; } + DomRegion BodyRegion { + get; + } + List BaseTypes { get; } diff --git a/src/Main/Base/Project/Src/Dom/IMember.cs b/src/Main/Base/Project/Src/Dom/IMember.cs index e6bbe1f85f..69cb73acc8 100644 --- a/src/Main/Base/Project/Src/Dom/IMember.cs +++ b/src/Main/Base/Project/Src/Dom/IMember.cs @@ -16,6 +16,9 @@ namespace ICSharpCode.SharpDevelop.Dom get; } + /// + /// Declaration region of the member (without body!) + /// DomRegion Region { get; } diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs index 6c8d4ff2e9..af1eebbb05 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs @@ -20,6 +20,7 @@ namespace ICSharpCode.SharpDevelop.Dom { ClassType classType; DomRegion region; + DomRegion bodyRegion; ICompilationUnit compilationUnit; @@ -172,6 +173,15 @@ namespace ICSharpCode.SharpDevelop.Dom } } + public DomRegion BodyRegion { + get { + return bodyRegion; + } + set { + bodyRegion = value; + } + } + public override string DotNetName { get { if (typeParameters == null || typeParameters.Count == 0) { diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs index 2a8647ec8d..7dd853a1da 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs @@ -74,8 +74,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver } } - string GetDocumentation(int line) + string GetDocumentation(int line, IList attributes) { + foreach (AST.AttributeSection att in attributes) { + if (att.StartLocation.Y > 0 && att.StartLocation.Y < line) + line = att.StartLocation.Y; + } List lines = new List(); int length = 0; while (line > 0) { @@ -141,7 +145,6 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver public override object Visit(AST.CompilationUnit compilationUnit, object data) { - //TODO: usings, Comments if (compilationUnit == null) { return null; } @@ -276,9 +279,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver public override object Visit(AST.TypeDeclaration typeDeclaration, object data) { DomRegion region = GetRegion(typeDeclaration.StartLocation, typeDeclaration.EndLocation); + DomRegion bodyRegion = GetRegion(typeDeclaration.BodyStartLocation, typeDeclaration.EndLocation); + DefaultClass c = new DefaultClass(cu, TranslateClassType(typeDeclaration.Type), ConvertModifier(typeDeclaration.Modifier, ModifierEnum.Internal), region, GetCurrentClass()); + c.BodyRegion = bodyRegion; ConvertAttributes(typeDeclaration, c); - c.Documentation = GetDocumentation(region.BeginLine); + c.Documentation = GetDocumentation(region.BeginLine, typeDeclaration.Attributes); if (currentClass.Count > 0) { DefaultClass cur = GetCurrentClass(); @@ -365,7 +371,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver { DomRegion region = GetRegion(delegateDeclaration.StartLocation, delegateDeclaration.EndLocation); DefaultClass c = new DefaultClass(cu, ClassType.Delegate, ConvertModifier(delegateDeclaration.Modifier, ModifierEnum.Internal), region, GetCurrentClass()); - c.Documentation = GetDocumentation(region.BeginLine); + c.Documentation = GetDocumentation(region.BeginLine, delegateDeclaration.Attributes); ConvertAttributes(delegateDeclaration, c); CreateDelegate(c, delegateDeclaration.Name, delegateDeclaration.ReturnType, delegateDeclaration.Templates, delegateDeclaration.Parameters); @@ -426,7 +432,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver DefaultClass c = GetCurrentClass(); DefaultMethod method = new DefaultMethod(methodDeclaration.Name, null, ConvertModifier(methodDeclaration.Modifier), region, bodyRegion, GetCurrentClass()); - method.Documentation = GetDocumentation(region.BeginLine); + method.Documentation = GetDocumentation(region.BeginLine, methodDeclaration.Attributes); ConvertTemplates(methodDeclaration.Templates, method); method.ReturnType = CreateReturnType(methodDeclaration.TypeReference, method); ConvertAttributes(methodDeclaration, method); @@ -466,7 +472,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver DefaultClass c = GetCurrentClass(); Constructor constructor = new Constructor(ConvertModifier(constructorDeclaration.Modifier), region, bodyRegion, GetCurrentClass()); - constructor.Documentation = GetDocumentation(region.BeginLine); + constructor.Documentation = GetDocumentation(region.BeginLine, constructorDeclaration.Attributes); ConvertAttributes(constructorDeclaration, constructor); if (constructorDeclaration.Parameters != null) { foreach (AST.ParameterDeclarationExpression par in constructorDeclaration.Parameters) { @@ -495,7 +501,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver { DomRegion region = GetRegion(fieldDeclaration.StartLocation, fieldDeclaration.EndLocation); DefaultClass c = GetCurrentClass(); - string doku = GetDocumentation(region.BeginLine); + string doku = GetDocumentation(region.BeginLine, fieldDeclaration.Attributes); if (currentClass.Count > 0) { for (int i = 0; i < fieldDeclaration.Fields.Count; ++i) { AST.VariableDeclaration field = (AST.VariableDeclaration)fieldDeclaration.Fields[i]; @@ -535,7 +541,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver property.SetterRegion = GetRegion(propertyDeclaration.SetRegion.StartLocation, propertyDeclaration.SetRegion.EndLocation); property.CanSet = true; } - property.Documentation = GetDocumentation(region.BeginLine); + property.Documentation = GetDocumentation(region.BeginLine, propertyDeclaration.Attributes); ConvertAttributes(propertyDeclaration, property); c.Properties.Add(property); return null; @@ -565,7 +571,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver ConvertAttributes(eventDeclaration, e); c.Events.Add(e); if (e != null) { - e.Documentation = GetDocumentation(region.BeginLine); + e.Documentation = GetDocumentation(region.BeginLine, eventDeclaration.Attributes); } else { LoggingService.Warn("NRefactoryASTConvertVisitor: " + eventDeclaration + " has no events!"); } @@ -578,7 +584,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver DomRegion bodyRegion = GetRegion(indexerDeclaration.BodyStart, indexerDeclaration.BodyEnd); DefaultProperty i = new DefaultProperty("Indexer", CreateReturnType(indexerDeclaration.TypeReference), ConvertModifier(indexerDeclaration.Modifier), region, bodyRegion, GetCurrentClass()); i.IsIndexer = true; - i.Documentation = GetDocumentation(region.BeginLine); + i.Documentation = GetDocumentation(region.BeginLine, indexerDeclaration.Attributes); ConvertAttributes(indexerDeclaration, i); if (indexerDeclaration.Parameters != null) { foreach (AST.ParameterDeclarationExpression par in indexerDeclaration.Parameters) { diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ParserFoldingStrategy.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ParserFoldingStrategy.cs index a0ff47ab54..c58b66f7c3 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ParserFoldingStrategy.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ParserFoldingStrategy.cs @@ -22,9 +22,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor if (c.ClassType == ClassType.Delegate) { return; } - if (c.Region.BeginLine < c.Region.EndLine) { - FoldMarker newFoldMarker = new FoldMarker(document, c.Region.BeginLine - 1, c.Region.BeginColumn - 1, - c.Region.EndLine - 1, c.Region.EndColumn, FoldType.TypeBody); + DomRegion cRegion = c.BodyRegion; + if (cRegion.IsEmpty) cRegion = c.Region; + if (cRegion.BeginLine < cRegion.EndLine) { + FoldMarker newFoldMarker = new FoldMarker(document, cRegion.BeginLine - 1, cRegion.BeginColumn - 1, + cRegion.EndLine - 1, cRegion.EndColumn, FoldType.TypeBody); if (newFoldMarker.Length > 0) { foldMarkers.Add(newFoldMarker); } From f13e699e992467dc1e36cf3b0eb2471f333d6316 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 16:38:52 +0000 Subject: [PATCH 09/49] Fixed SD2-724: CustomDialog does not expand to fit buttons git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1347 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Services/MessageService/CustomDialog.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Main/Core/Project/Src/Services/MessageService/CustomDialog.cs b/src/Main/Core/Project/Src/Services/MessageService/CustomDialog.cs index 41c0bb1f87..771d5e4131 100644 --- a/src/Main/Core/Project/Src/Services/MessageService/CustomDialog.cs +++ b/src/Main/Core/Project/Src/Services/MessageService/CustomDialog.cs @@ -50,7 +50,6 @@ namespace ICSharpCode.Core for (int i = 0; i < buttons.Length; i++) { Button newButton = new Button(); newButton.FlatStyle = FlatStyle.System; - newButton.Anchor = AnchorStyles.Right; newButton.Tag = i; string buttonLabel = StringParser.Parse(buttonLabels[i]); newButton.Text = buttonLabel; @@ -68,15 +67,17 @@ namespace ICSharpCode.Core CancelButton = buttons[cancelButton]; } - pos -= 4; // remove space after last button + pos += 4; // add space before first button + // (we don't start with pos=4 because this space doesn't belong to the button panel) + if (pos > clientSize.Width) { clientSize.Width = pos; } clientSize.Height += panel.Height + 6; this.ClientSize = clientSize; - int start = (panel.ClientSize.Width - pos) / 2; + int start = (clientSize.Width - pos) / 2; for (int i = 0; i < buttons.Length; i++) { - ((Button)buttons[i]).Location = new Point(start + positions[i], 4); + buttons[i].Location = new Point(start + positions[i], 4); } panel.Controls.AddRange(buttons); } @@ -92,7 +93,6 @@ namespace ICSharpCode.Core this.Close(); } - #region Windows Forms Designer generated code /// /// This method is required for Windows Forms designer support. /// Do not change the method contents inside the source code editor. The Forms designer might @@ -123,7 +123,6 @@ namespace ICSharpCode.Core // // CustomDialog // -// this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(274, 112); this.Controls.Add(this.label); this.Controls.Add(this.panel); @@ -137,6 +136,5 @@ namespace ICSharpCode.Core this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "CustomDialog"; } - #endregion } } From 8b3834d8c7dac9f1c35fe59f4331b70ef23d3277 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 16:51:13 +0000 Subject: [PATCH 10/49] Fixed SD2-730: Closing one of the partial form classes of a newly created form git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1348 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/DesignerGenerator/AbstractDesignerGenerator.cs | 4 ++++ .../Project/Src/DesignerLoader/NRefactoryDesignerLoader.cs | 6 +++++- src/Main/Base/Project/Src/Commands/FileCommands.cs | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs index a6f9e02f4a..d601be63e4 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs @@ -152,6 +152,10 @@ namespace ICSharpCode.FormsDesigner if (formClass == null || initializeComponent == null) { throw new InvalidOperationException("InitializeComponent method not found in framework-generated CodeDom."); } + if (this.formClass == null) { + MessageService.ShowMessage("Cannot save form: InitializeComponent method does not exist anymore. You should not modify the Designer.cs file while editing a form."); + return; + } if (formClass.Name != this.formClass.Name) { LoggingService.Info("Renaming form to " + formClass.Name); diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/NRefactoryDesignerLoader.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/NRefactoryDesignerLoader.cs index 715e5c1771..fc267c122a 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/NRefactoryDesignerLoader.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerLoader/NRefactoryDesignerLoader.cs @@ -329,7 +329,11 @@ namespace ICSharpCode.FormsDesigner this.CodeDomProvider.GenerateCodeFromCompileUnit(unit, Console.Out, null); } #endif - generator.MergeFormChanges(unit); + try { + generator.MergeFormChanges(unit); + } catch (Exception ex) { + MessageService.ShowError(ex); + } } // public void Reload() diff --git a/src/Main/Base/Project/Src/Commands/FileCommands.cs b/src/Main/Base/Project/Src/Commands/FileCommands.cs index 4e6f072de9..2d1aaa5773 100644 --- a/src/Main/Base/Project/Src/Commands/FileCommands.cs +++ b/src/Main/Base/Project/Src/Commands/FileCommands.cs @@ -30,7 +30,7 @@ namespace ICSharpCode.SharpDevelop.Commands "${res:Dialog.NewFile.AddToProjectQuestionTitle}", "${res:Dialog.NewFile.AddToProjectQuestionProject}", "${res:Dialog.NewFile.AddToProjectQuestionStandalone}") - == 1) + == 0) { new Project.Commands.AddNewItemsToProject().Run(); return; From c1b98264a4fbbef387216c1a3b84a357e75753da Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 17:12:54 +0000 Subject: [PATCH 11/49] Fixed SD2-782: Null reference when adding existing item/new folder to project git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1349 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Gui/Components/ExtTreeView/ExtTreeView.cs | 18 +++++++++++++++++- .../Commands/ReferenceFolderNodeCommands.cs | 5 +++-- .../ProjectBrowser/ProjectBrowserControl.cs | 1 + 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeView.cs b/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeView.cs index a5562c803c..2e9d4ea9cc 100644 --- a/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeView.cs +++ b/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeView.cs @@ -249,6 +249,20 @@ namespace ICSharpCode.SharpDevelop.Gui } } + bool canClearSelection = true; + + /// + /// Gets/Sets whether the user can clear the selection by clicking in the empty area. + /// + public bool CanClearSelection { + get { + return canClearSelection; + } + set { + canClearSelection = value; + } + } + protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); @@ -258,7 +272,9 @@ namespace ICSharpCode.SharpDevelop.Gui SelectedNode = node; } } else { - SelectedNode = null; + if (canClearSelection) { + SelectedNode = null; + } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs index b263268e1a..3be027fce2 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs @@ -117,7 +117,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { public override void Run() { - AbstractProjectBrowserTreeNode node = Owner as AbstractProjectBrowserTreeNode; + AbstractProjectBrowserTreeNode node = ProjectBrowserPad.Instance.SelectedNode; if (node != null && node.Project != null) { using (AddWebReferenceDialog refDialog = new AddWebReferenceDialog(node.Project)) { refDialog.NamespacePrefix = node.Project.RootNamespace; @@ -152,7 +152,8 @@ namespace ICSharpCode.SharpDevelop.Project.Commands } else if (node is ReferenceFolder && node.Parent != null && node.Parent is ProjectNode) { webReferencesNode = AddWebReferenceToProjectNode((ProjectNode)node.Parent, webReference); } else { - LoggingService.Error("AddWebReferenceToProjectBrowser: Selected node type is not handled."); + LoggingService.Warn("AddWebReferenceToProjectBrowser: Selected node type is not handled."); + AddWebReferenceToProjectBrowser(node.Parent as AbstractProjectBrowserTreeNode, webReference); } if (webReferencesNode != null) { diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs index 6dea583738..c2a6fa7a4b 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs @@ -62,6 +62,7 @@ namespace ICSharpCode.SharpDevelop.Project public ProjectBrowserControl() { InitializeComponent(); + treeView.CanClearSelection = false; treeView.BeforeSelect += TreeViewBeforeSelect; treeView.AfterExpand += TreeViewAfterExpand; FileService.FileRenamed += FileServiceFileRenamed; From a187bb5823129d7ba450d541d1d552653b6c2b22 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 17:19:11 +0000 Subject: [PATCH 12/49] Fixed SD2-774: Refresh button in Project Browser always disabled git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1350 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Pads/ProjectBrowser/ProjectBrowserPanel.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPanel.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPanel.cs index 10beeeddce..27ea31e2af 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPanel.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPanel.cs @@ -60,14 +60,15 @@ namespace ICSharpCode.SharpDevelop.Project void TreeViewBeforeSelect(object sender, TreeViewCancelEventArgs e) { - AbstractProjectBrowserTreeNode node = e.Node as AbstractProjectBrowserTreeNode; - if (node == null) { - toolStrip.Items.Clear(); - return; - } + UpdateToolStrip(e.Node as AbstractProjectBrowserTreeNode); + } + + void UpdateToolStrip(AbstractProjectBrowserTreeNode node) + { toolStrip.Items.Clear(); toolStrip.Items.AddRange(standardItems); - if (node.ToolbarAddinTreePath != null) { + ToolbarService.UpdateToolbar(toolStrip); + if (node != null && node.ToolbarAddinTreePath != null) { toolStrip.Items.Add(new ToolStripSeparator()); toolStrip.Items.AddRange((ToolStripItem[])AddInTree.BuildItems(node.ToolbarAddinTreePath, node, false).ToArray(typeof(ToolStripItem))); } @@ -75,6 +76,7 @@ namespace ICSharpCode.SharpDevelop.Project public void ViewSolution(Solution solution) { + UpdateToolStrip(null); projectBrowserControl.ViewSolution(solution); } @@ -161,6 +163,7 @@ namespace ICSharpCode.SharpDevelop.Project public void Clear() { projectBrowserControl.Clear(); + UpdateToolStrip(null); } public void SelectFile(string fileName) From a9113721a79b04ea3559fd193a07a7a734800a66 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 17:43:33 +0000 Subject: [PATCH 13/49] Fixed SD2-757: Collapsing debugger tooltip git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1351 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Service/DynamicTreeDebuggerRow.cs | 1 + .../Src/Gui/TreeGrid/DynamicTreeRow.cs | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DynamicTreeDebuggerRow.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DynamicTreeDebuggerRow.cs index 7b656faf94..d8153b1548 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DynamicTreeDebuggerRow.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DynamicTreeDebuggerRow.cs @@ -217,6 +217,7 @@ namespace ICSharpCode.SharpDevelop.Services DynamicTreeRow MakeSubMenu(string name, params IEnumerable[] elements) { DynamicTreeRow rootRow = new DynamicTreeRow(); + rootRow.ShowMinusWhileExpanded = true; DebuggerGridControl.AddColumns(rootRow.ChildColumns); rootRow[2].Text = name; foreach(IEnumerable rows in elements) { diff --git a/src/Main/Base/Project/Src/Gui/TreeGrid/DynamicTreeRow.cs b/src/Main/Base/Project/Src/Gui/TreeGrid/DynamicTreeRow.cs index 8cc9c33a93..b03152e973 100644 --- a/src/Main/Base/Project/Src/Gui/TreeGrid/DynamicTreeRow.cs +++ b/src/Main/Base/Project/Src/Gui/TreeGrid/DynamicTreeRow.cs @@ -193,15 +193,32 @@ namespace ICSharpCode.SharpDevelop.Gui.TreeGrid #region Child form static bool isOpeningChild; + /// + /// Block the next click event - used to ensure that a click on the "-" sign + /// does not cause the submenu to open again when the "-" sign becomes a "+" sign + /// before the click event is handled. + /// + bool blockClickEvent; + protected virtual void OnPlusClick(object sender, DynamicListEventArgs e) { + if (blockClickEvent) { blockClickEvent = false; return; } OnExpanding(e); ChildForm frm = new ChildForm(); frm.Closed += delegate { + blockClickEvent = true; if (expandedIn != null) expandedIn.Remove(e.List); OnCollapsed(e); plus.RaiseItemChanged(); + Timer timer = new Timer(); + timer.Interval = 85; + timer.Tick += delegate(object sender2, EventArgs e2) { + ((Timer)sender2).Stop(); + ((Timer)sender2).Dispose(); + blockClickEvent = false; + }; + timer.Start(); }; Point p = e.List.PointToScreen(e.List.GetPositionFromRow(this)); p.Offset(e.List.Columns[0].Width, Height); @@ -292,6 +309,9 @@ namespace ICSharpCode.SharpDevelop.Gui.TreeGrid bool showWindowWithoutActivation; + /// + /// Gets/Sets whether the window will receive focus when it is shown. + /// public bool ShowWindowWithoutActivation { get { return showWindowWithoutActivation; From a9dcb57f75bf449407d3788f19571fa9bfa9dce8 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 19:05:02 +0000 Subject: [PATCH 14/49] Fixed SD2-736: When editing the C# highlighting, the Environment section cannot be changed git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1352 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/EditHighlightingPanel.cs | 9 +++- .../Project/Src/EditorHighlightColor.cs | 43 +++++++++---------- .../Project/Src/Nodes/AbstractNode.cs | 7 +-- .../Project/Src/Nodes/DigitsNode.cs | 7 ++- .../Project/Src/Nodes/EnvironmentNode.cs | 27 ++++++++---- .../Project/Src/Nodes/KeywordListNode.cs | 24 ++++------- .../Project/Src/Nodes/KeywordListsNode.cs | 6 +-- .../Project/Src/Nodes/MarkerNode.cs | 12 +++--- .../Project/Src/Nodes/MarkersNode.cs | 6 +-- .../Project/Src/Nodes/PropertiesNode.cs | 19 ++++---- .../Project/Src/Nodes/RuleSetNode.cs | 42 +++++++++--------- .../Project/Src/Nodes/RuleSetsNode.cs | 9 ++-- .../Project/Src/Nodes/SchemeNode.cs | 42 +++++++++++------- .../Project/Src/Nodes/SpanNode.cs | 40 +++++++++-------- .../Project/Src/Nodes/SpansNode.cs | 6 +-- .../DefaultHighlightingStrategy.cs | 8 ++++ .../Workbench/Layouts/SdiWorkspaceWindow.cs | 4 ++ 17 files changed, 169 insertions(+), 142 deletions(-) diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingPanel.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingPanel.cs index 025a9a3f2f..98cc83ff9c 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingPanel.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingPanel.cs @@ -190,8 +190,13 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels DialogResult res = dlg.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); if (res == DialogResult.OK) { - using (StreamWriter sw = new StreamWriter(item.FileName, false)) { - sw.WriteLine(item.Node.ToXml().Replace("\n", "\r\n")); + using (XmlTextWriter writer = new XmlTextWriter(item.FileName, Encoding.UTF8)) { + writer.Formatting = Formatting.Indented; + writer.IndentChar = '\t'; + writer.Indentation = 1; + writer.WriteStartDocument(); + item.Node.WriteXml(writer); + writer.WriteEndDocument(); } // refresh item text userList.Items.RemoveAt(userList.SelectedIndex); diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/EditorHighlightColor.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditorHighlightColor.cs index 7221675bde..239ff26417 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/EditorHighlightColor.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditorHighlightColor.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes { bool hasForeColor = false; bool hasBackColor = false; - + Color foreColor; bool sysForeColor = false; string sysForeColorName = ""; @@ -105,7 +105,7 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes el.Attributes["color"] == null && el.Attributes["bgcolor"] == null) { - noColor = true; + noColor = true; return; } @@ -146,6 +146,11 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes } } + public static EditorHighlightColor FromTextEditor(ICSharpCode.TextEditor.Document.HighlightColor color) + { + return new EditorHighlightColor(color.HasForgeground, color.Color, color.HasBackground, color.BackgroundColor, color.Bold, color.Italic); + } + public EditorHighlightColor(bool hascolor, Color Color, bool hasbackcolor, Color BackColor, bool bold, bool italic) { hasForeColor = hascolor; @@ -209,38 +214,30 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes return Color.FromArgb(a, r, g, b); } - public string ToXml() + public void WriteXmlAttributes(XmlWriter writer) { - string str = ""; - str += "bold=\"" + bold.ToString().ToLowerInvariant() + "\" "; - str += "italic=\"" + italic.ToString().ToLowerInvariant() + "\" "; + writer.WriteAttributeString("bold", bold.ToString().ToLowerInvariant()); + writer.WriteAttributeString("italic", italic.ToString().ToLowerInvariant()); if (hasForeColor) { - str += "color=\""; if (sysForeColor) { - str += "SystemColors." + sysForeColorName; + writer.WriteAttributeString("color", "SystemColors." + sysForeColorName); } else { - str += ReplaceColorName("#" + (foreColor.A != 255 ? foreColor.A.ToString("X2") : "") + - foreColor.R.ToString("X2") + - foreColor.G.ToString("X2") + - foreColor.B.ToString("X2")); + writer.WriteAttributeString("color", ReplaceColorName("#" + (foreColor.A != 255 ? foreColor.A.ToString("X2") : "") + + foreColor.R.ToString("X2") + + foreColor.G.ToString("X2") + + foreColor.B.ToString("X2"))); } - - str += "\" "; } if (hasBackColor) { - str += "bgcolor=\""; if (sysBackColor) { - str += "SystemColors." + sysBackColorName; + writer.WriteAttributeString("bgcolor", "SystemColors." + sysBackColorName); } else { - str += ReplaceColorName("#" + (backColor.A != 255 ? backColor.A.ToString("X2") : "") + - backColor.R.ToString("X2") + - backColor.G.ToString("X2") + - backColor.B.ToString("X2")); + writer.WriteAttributeString("bgcolor", ReplaceColorName("#" + (backColor.A != 255 ? backColor.A.ToString("X2") : "") + + backColor.R.ToString("X2") + + backColor.G.ToString("X2") + + backColor.B.ToString("X2"))); } - - str += "\" "; } - return str; } Color ParseSysColor(string colorName) diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/AbstractNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/AbstractNode.cs index 6ad7a8f25f..a6e0e8c443 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/AbstractNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/AbstractNode.cs @@ -36,11 +36,6 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes public abstract void UpdateNodeText(); // should be made abstract when implementing ToXml() - public virtual string ToXml() { return ""; } - - public static string ReplaceXmlChars(string str) - { - return str.Replace("&", "&").Replace("<", "<").Replace(">", ">"); - } + public abstract void WriteXml(XmlWriter writer); } } diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/DigitsNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/DigitsNode.cs index 6adc8452ee..d2eeae3d96 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/DigitsNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/DigitsNode.cs @@ -45,9 +45,12 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes { } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - return "\t\n\n"; + writer.WriteStartElement("Digits"); + writer.WriteAttributeString("name", "Digits"); + color.WriteXmlAttributes(writer); + writer.WriteEndElement(); } } diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/EnvironmentNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/EnvironmentNode.cs index bd91669436..6b1f1e600c 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/EnvironmentNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/EnvironmentNode.cs @@ -7,6 +7,7 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Windows.Forms; using System.Drawing; using System.Xml; @@ -26,8 +27,6 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes public EnvironmentNode(XmlElement el) { - - ArrayList envColors = new ArrayList(); ArrayList envColorNames = new ArrayList(); ArrayList envColorDescriptions = new ArrayList(); @@ -40,13 +39,22 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes } } } + + foreach (KeyValuePair pair in new DefaultHighlightingStrategy().EnvironmentColors) { + if (!envColorNames.Contains(pair.Key)) { + envColorNames.Add(pair.Key); + envColorDescriptions.Add("${res:Dialog.HighlightingEditor.EnvColors." + pair.Key + "}"); + envColors.Add(EditorHighlightColor.FromTextEditor(pair.Value)); + } + } + EnvironmentNode.ColorNames = (string[])envColorNames.ToArray(typeof(string)); this.ColorDescs = (string[])envColorDescriptions.ToArray(typeof(string)); this.Colors = (EditorHighlightColor[])envColors.ToArray(typeof(EditorHighlightColor)); StringParser.Parse(ColorDescs); Text = ResNodeName("EnvironmentColors"); - + panel = new EnvironmentOptionPanel(this); } @@ -54,14 +62,15 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes { } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - string str = "\t\n"; - for (int i = 0; i <= ColorNames.GetUpperBound(0); ++i) { - str += "\t\t<" + ColorNames[i] + " " + Colors[i].ToXml() + "/>\n"; + writer.WriteStartElement("Environment"); + for (int i = 0; i < ColorNames.Length; i++) { + writer.WriteStartElement(ColorNames[i]); + Colors[i].WriteXmlAttributes(writer); + writer.WriteEndElement(); } - str += "\t\n\n"; - return str; + writer.WriteEndElement(); } } diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListNode.cs index 4fd34fb144..4fea82c578 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListNode.cs @@ -57,7 +57,7 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes { Text = ResNodeName("KeywordList"); panel = new KeywordListOptionPanel(this); - + if (el == null) return; color = new EditorHighlightColor(el); @@ -88,23 +88,17 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes if (name != "") Text = name; } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - StringBuilder ret = new StringBuilder("\t\t\t\n"; - ret.Append(color.ToXml()); - ret.Append(">\n"); + writer.WriteStartElement("KeyWords"); + writer.WriteAttributeString("name", name); + color.WriteXmlAttributes(writer); foreach(string str in words) { - ////ret += "\t\t\t\t\n"; - ret.Append("\t\t\t\t\n"); + writer.WriteStartElement("Key"); + writer.WriteAttributeString("word", str); + writer.WriteEndElement(); } - ////ret += "\t\t\t\n\n"; - ret.Append("\t\t\t\n\n"); - return ret.ToString(); + writer.WriteEndElement(); } } diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListsNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListsNode.cs index ad07218879..6fe0fbe4d3 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListsNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListsNode.cs @@ -37,13 +37,11 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes { } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - string ret = ""; foreach (KeywordListNode node in Nodes) { - ret += node.ToXml(); + node.WriteXml(writer); } - return ret; } } diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkerNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkerNode.cs index c724b23ffa..431cb84ce0 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkerNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkerNode.cs @@ -54,13 +54,13 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes Text = what; } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - string ret = "\t\t\t\n\n"; - return ret; + writer.WriteStartElement("Mark" + (previous ? "Previous" : "Following")); + color.WriteXmlAttributes(writer); + if (markMarker) writer.WriteAttributeString("markmarker", "true"); + writer.WriteString(what); + writer.WriteEndElement(); } public string What { diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkersNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkersNode.cs index c2fd039309..9a9a19306f 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkersNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkersNode.cs @@ -36,13 +36,11 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes { } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - string ret = ""; foreach (MarkerNode node in Nodes) { - ret += node.ToXml(); + node.WriteXml(writer); } - return ret; } } diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/PropertiesNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/PropertiesNode.cs index 2bebf70ac1..0cd1559b3f 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/PropertiesNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/PropertiesNode.cs @@ -33,20 +33,21 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes } } - + public override void UpdateNodeText() { } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - string ret = "\t\n"; + writer.WriteStartElement("Properties"); foreach (DictionaryEntry de in Properties) { - ret += "\t\t\n"; + writer.WriteStartElement("Property"); + writer.WriteAttributeString("name", (string)de.Key); + writer.WriteAttributeString("value", (string)de.Value); + writer.WriteEndElement(); } - ret += "\t\n\n"; - return ret; + writer.WriteEndElement(); } } @@ -55,7 +56,7 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes private System.Windows.Forms.Button addBtn; private System.Windows.Forms.Button editBtn; private System.Windows.Forms.Button removeBtn; - private System.Windows.Forms.ListView listView; + private System.Windows.Forms.ListView listView; public PropertiesOptionPanel(PropertiesNode parent) : base(parent) { @@ -70,7 +71,7 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes listView = (ListView)ControlDictionary["listView"]; } - + public override void StoreSettings() { PropertiesNode node = (PropertiesNode)parent; diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetNode.cs index 05f211b785..b81729b349 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetNode.cs @@ -69,8 +69,8 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes Nodes.Add(keywordNode); Nodes.Add(spansNode); Nodes.Add(prevMarkerNode); - Nodes.Add(nextMarkerNode); - + Nodes.Add(nextMarkerNode); + } public RuleSetNode(string Name, string Delim, string Ref, bool noEsc, bool noCase) @@ -89,7 +89,7 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes Nodes.Add(keywordNode); Nodes.Add(spansNode); Nodes.Add(prevMarkerNode); - Nodes.Add(nextMarkerNode); + Nodes.Add(nextMarkerNode); panel = new RuleSetOptionPanel(this); } @@ -101,25 +101,25 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes } } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - if (reference != "") return "\t\t\n\n"; - - string ret = "\t\t\n\n"; - - ret += spansNode.ToXml(); - ret += prevMarkerNode.ToXml(); - ret += nextMarkerNode.ToXml(); - ret += keywordNode.ToXml(); - - ret += "\t\t\n\n"; - - return ret; + writer.WriteStartElement("RuleSet"); + if (!isRoot) + writer.WriteAttributeString("name", name); + if (reference != "") { + writer.WriteAttributeString("reference", reference); + } else { + writer.WriteAttributeString("ignorecase", ignoreCase.ToString().ToLowerInvariant()); + if (noEscapeSequences) + writer.WriteAttributeString("noescapesequences", "true"); + if (delimiters != "") + writer.WriteElementString("Delimiters", delimiters); + spansNode.WriteXml(writer); + prevMarkerNode.WriteXml(writer); + nextMarkerNode.WriteXml(writer); + keywordNode.WriteXml(writer); + } + writer.WriteEndElement(); } public string Delimiters { diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetsNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetsNode.cs index 70778f6941..8530c34a30 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetsNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetsNode.cs @@ -35,14 +35,13 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes { } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - string ret = "\t\n"; + writer.WriteStartElement("RuleSets"); foreach (RuleSetNode node in Nodes) { - ret += node.ToXml(); + node.WriteXml(writer); } - ret += "\t\n\n"; - return ret; + writer.WriteEndElement(); } } diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SchemeNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SchemeNode.cs index 31b8c8169c..4755c30986 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SchemeNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SchemeNode.cs @@ -18,11 +18,21 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes { string name; string[] extensions; + string extends; + + public string Extends { + get { + return extends; + } + set { + extends = value; + } + } public string[] Extensions { get { return extensions; - } + } set { extensions = value; } @@ -60,6 +70,8 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes extensions = el.Attributes["extensions"].InnerText.Split('|'); } + extends = el.GetAttribute("extends"); + UpdateNodeText(); panel = new SchemeOptionPanel(this); @@ -82,23 +94,23 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes Text = name; } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - string str = - "\n" + - "\n\n" + - "\n\n"; + writer.WriteComment("This file was autogenerated by the #Develop highlighting editor."); + writer.WriteStartElement("SyntaxDefinition"); - str += envNode.ToXml(); - str += propNode.ToXml(); - str += digitsNode.ToXml(); - str += rulesetsNode.ToXml(); - - str += - "\n"; + writer.WriteAttributeString("name", name); + writer.WriteAttributeString("extensions", String.Join(";", extensions)); + if (extends != "") { + writer.WriteAttributeString("extends", extends); + } - return str; - + envNode.WriteXml(writer); + propNode.WriteXml(writer); + digitsNode.WriteXml(writer); + rulesetsNode.WriteXml(writer); + + writer.WriteEndElement(); } } diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs index d701af5ad4..50a338f793 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs @@ -59,27 +59,32 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - string ret = ""; - ret = "\t\t\t\n"; + writer.WriteStartElement("Begin"); + if (beginColor != null && !beginColor.NoColor) + beginColor.WriteXmlAttributes(writer); + writer.WriteString(begin); + writer.WriteEndElement(); if (end != "") { - ret += "\t\t\t\t\n"; + writer.WriteStartElement("End"); + if (endColor != null && !endColor.NoColor) + endColor.WriteXmlAttributes(writer); + writer.WriteString(end); + writer.WriteEndElement(); } - ret += "\t\t\t\n\n"; - return ret; + + writer.WriteEndElement(); } public SpanNode(string Name) @@ -91,6 +96,7 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes panel = new SpanOptionPanel(this); } + public override void UpdateNodeText() { if (name != "") { Text = name; return; } @@ -121,7 +127,7 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes } public EditorHighlightColor BeginColor { - get { + get { return beginColor; } set { diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpansNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpansNode.cs index 0bdc0b816e..c167ae1a5b 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpansNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpansNode.cs @@ -35,13 +35,11 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes { } - public override string ToXml() + public override void WriteXml(XmlWriter writer) { - string ret = ""; foreach (SpanNode node in Nodes) { - ret += node.ToXml(); + node.WriteXml(writer); } - return ret; } } diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/DefaultHighlightingStrategy.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/DefaultHighlightingStrategy.cs index 9f3027a1dc..6aefaf96b0 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/DefaultHighlightingStrategy.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/DefaultHighlightingStrategy.cs @@ -24,6 +24,14 @@ namespace ICSharpCode.TextEditor.Document List rules = new List(); Dictionary environmentColors = new Dictionary(); + + public IEnumerable> EnvironmentColors { + get { + return environmentColors; + } + } + + Dictionary properties = new Dictionary(); string[] extensions; diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs index 0a508fbba3..6aecd4c068 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs @@ -386,6 +386,10 @@ namespace ICSharpCode.SharpDevelop.Gui public virtual void OnWindowSelected(EventArgs e) { + if (viewTabControl != null) { + TabPage page = viewTabControl.TabPages[viewTabControl.TabIndex]; + if (page.Controls.Count == 1 && !page.ContainsFocus) page.Controls[0].Focus(); + } if (WindowSelected != null) { WindowSelected(this, e); } From dd4e5f9ea96d9f1f31cb6b98bda9457697325af3 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 19:23:05 +0000 Subject: [PATCH 15/49] Fixed crash when parsing incomplete Imports statement. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1353 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Parser/VBNet/Parser.cs | 4 ++-- .../Project/Src/Parser/VBNet/VBNET.ATG | 4 ++-- .../GlobalScope/UsingDeclarationTests.cs | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs index 9839ad27ba..ebab3c07a7 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs @@ -379,7 +379,7 @@ ref val); out u); #line 537 "VBNET.ATG" - usings.Add(u); + if (u != null) { usings.Add(u); } while (la.kind == 12) { lexer.NextToken(); ImportClause( @@ -387,7 +387,7 @@ out u); out u); #line 539 "VBNET.ATG" - usings.Add(u); + if (u != null) { usings.Add(u); } } EndOfStmt(); diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG index 51c2d292fe..91214f8714 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG @@ -534,9 +534,9 @@ ImportsStmt Point startPos = t.Location; Using u; .) - ImportClause (. usings.Add(u); .) + ImportClause (. if (u != null) { usings.Add(u); } .) { - "," ImportClause (. usings.Add(u); .) + "," ImportClause (. if (u != null) { usings.Add(u); } .) } EndOfStmt (. diff --git a/src/Libraries/NRefactory/Test/Parser/GlobalScope/UsingDeclarationTests.cs b/src/Libraries/NRefactory/Test/Parser/GlobalScope/UsingDeclarationTests.cs index b2d1a4c33f..37611bedde 100644 --- a/src/Libraries/NRefactory/Test/Parser/GlobalScope/UsingDeclarationTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/GlobalScope/UsingDeclarationTests.cs @@ -107,7 +107,25 @@ namespace ICSharpCode.NRefactory.Tests.AST IParser parser = ParserFactory.CreateParser(SupportedLanguage.VBNet, new StringReader(program)); parser.Parse(); Assert.IsTrue(parser.Errors.count > 0); + UsingDeclaration u = (UsingDeclaration)parser.CompilationUnit.Children[0]; + foreach (Using us in u.Usings) { + Assert.IsNotNull(us); + } } + + [Test] + public void VBNetWrongUsing2Test() + { + string program = "Imports ,\n"; + IParser parser = ParserFactory.CreateParser(SupportedLanguage.VBNet, new StringReader(program)); + parser.Parse(); + Assert.IsTrue(parser.Errors.count > 0); + UsingDeclaration u = (UsingDeclaration)parser.CompilationUnit.Children[0]; + foreach (Using us in u.Usings) { + Assert.IsNotNull(us); + } + } + [Test] public void VBNetDeclarationTest() { From d2c4e4c562390d770aeac4ac46fffae4cea392eb Mon Sep 17 00:00:00 2001 From: Peter Forstmeier Date: Tue, 25 Apr 2006 21:01:03 +0000 Subject: [PATCH 16/49] Textbased Items now use the same code for ContentAlignment and drawing in the designer and in printing. Better handling of Row Items git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1354 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Designer/SectionControls/ReportSection.cs | 4 +- .../VisualControls/ReportTextControl.cs | 43 +++--- .../ReportItems/TextBased/ItemsHelper.cs | 14 +- .../ReportItems/TextBased/ReportDataItem.cs | 10 +- .../ReportItems/TextBased/ReportTextItem.cs | 31 ++-- .../SharpReport/Visitors/LoadReportVisitor.cs | 9 +- .../SharpReportCore/BaseItems/BaseDataItem.cs | 9 +- .../BaseItems/BaseReportItem.cs | 16 +- .../SharpReportCore/BaseItems/BaseTextItem.cs | 146 ++++++------------ .../SharpReportCore/BaseItems/RowItem.cs | 14 +- .../Printing/Text/TextDrawer.cs | 92 ++++++++++- .../SharpReportCore/ReportSettings.cs | 2 +- .../SharpReportCore/Xml/XmlHelper.cs | 4 +- 13 files changed, 220 insertions(+), 174 deletions(-) diff --git a/src/AddIns/Misc/SharpReport/SharpReport/Designer/SectionControls/ReportSection.cs b/src/AddIns/Misc/SharpReport/SharpReport/Designer/SectionControls/ReportSection.cs index 901971dcbb..9ddf27fb44 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/Designer/SectionControls/ReportSection.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/Designer/SectionControls/ReportSection.cs @@ -248,7 +248,7 @@ namespace SharpReport{ } private void OnItemAddeded(object sender, CollectionItemEventArgs e){ - + SharpReport.Designer.IDesignable iDesignable = e.Item as SharpReport.Designer.IDesignable; if (iDesignable != null) { @@ -259,7 +259,7 @@ namespace SharpReport{ iDesignable.VisualControl.Focus(); iDesignable.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler (OnPropertyChanged); } - } + } } private void OnRemoveTopLevelItem(object sender, CollectionItemEventArgs e){ diff --git a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportTextControl.cs b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportTextControl.cs index af19ca0363..c1b1ca503e 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportTextControl.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportTextControl.cs @@ -18,7 +18,11 @@ namespace SharpReport.Designer{ /// Description of ReportTextItem. /// internal class ReportTextControl : ReportControlBase{ - StringFormat stringFormat; + + private StringTrimming stringTrimming; + private ContentAlignment contentAlignment; + TextDrawer textDrawer = new TextDrawer(); + public ReportTextControl():base(){ InitializeComponent(); @@ -37,31 +41,31 @@ namespace SharpReport.Designer{ public override string Text{ get { return base.Text; } - set { - base.Text = value; - } + set { base.Text = value;} } - public StringFormat StringFormat{ + + public StringTrimming StringTrimming { set { - if (this.stringFormat != value) { - this.stringFormat = value; - this.Invalidate(); - } + stringTrimming = value; + this.Invalidate(); } } + + public System.Drawing.ContentAlignment ContentAlignment { + set { + this.contentAlignment = value; + this.Invalidate(); + } + } + protected override void OnPaint(System.Windows.Forms.PaintEventArgs pea){ - + base.OnPaint(pea); base.DrawEdges (pea); base.DrawDecorations(pea); - - if (this.stringFormat == null) { - this.stringFormat = GlobalValues.StandartStringFormat(); - this.stringFormat.LineAlignment = StringAlignment.Center; - } - + string str; if (String.IsNullOrEmpty(this.Text)) { @@ -70,10 +74,9 @@ namespace SharpReport.Designer{ str = this.Text; } - pea.Graphics.DrawString(str,this.Font, - new SolidBrush(this.ForeColor), - (RectangleF)this.ClientRectangle, - this.stringFormat); + this.textDrawer.DrawString (pea.Graphics,this.Text,this.Font, + new SolidBrush(this.ForeColor),(RectangleF)this.ClientRectangle, + this.stringTrimming,this.contentAlignment); } diff --git a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ItemsHelper.cs b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ItemsHelper.cs index b5e4aceaef..468da15ed0 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ItemsHelper.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ItemsHelper.cs @@ -20,10 +20,10 @@ namespace SharpReport { /// created by - Forstmeier Peter /// created on - 31.08.2005 13:49:47 /// - public class ItemsHelper : object { + internal class ItemsHelper : object { - public static void UpdateBaseFromTextControl (ReportObjectControlBase control, + internal static void UpdateBaseFromTextControl (ReportObjectControlBase control, BaseReportItem item) { item.Size = control.Size; @@ -32,9 +32,10 @@ namespace SharpReport { item.BackColor = control.BackColor; item.ForeColor = control.ForeColor; item.Font = control.Font; + } - public static void UpdateBaseFromGraphicControl (AbstractGraphicControl control, + internal static void UpdateBaseFromGraphicControl (AbstractGraphicControl control, BaseGraphicItem item) { ItemsHelper.UpdateBaseFromTextControl (control,item); @@ -43,7 +44,7 @@ namespace SharpReport { } - public static void UpdateControlFromTextBase (ReportObjectControlBase control, + internal static void UpdateControlFromTextBase (ReportObjectControlBase control, BaseReportItem item) { control.BackColor = item.BackColor; @@ -53,13 +54,10 @@ namespace SharpReport { control.Font = item.Font; control.Name = item.Name; BaseTextItem b = item as BaseTextItem; -// if (b != null) { -// control. = b.StringAlignment; -// } } - public static void UpdateControlFromGraphicBase (AbstractGraphicControl control, + internal static void UpdateControlFromGraphicBase (AbstractGraphicControl control, BaseGraphicItem item) { ItemsHelper.UpdateControlFromTextBase(control,item); control.Location = item.Location; diff --git a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportDataItem.cs b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportDataItem.cs index 7a0ef28e1c..e7256275dc 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportDataItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportDataItem.cs @@ -38,9 +38,12 @@ namespace SharpReport.ReportItems{ visualControl = new ReportDbTextControl(); this.visualControl.Text = base.ColumnName; - visualControl.StringFormat = base.StringFormat; + this.Text = base.ColumnName; + visualControl.ContentAlignment = base.ContentAlignment; + visualControl.StringTrimming = base.StringTrimming; + ItemsHelper.UpdateBaseFromTextControl (this.visualControl,this); this.visualControl.Click += new EventHandler(OnControlSelect); @@ -65,7 +68,10 @@ namespace SharpReport.ReportItems{ private void BasePropertyChange (object sender, PropertyChangedEventArgs e){ ItemsHelper.UpdateControlFromTextBase(this.visualControl,this); - this.visualControl.StringFormat = base.StringFormat; + + this.visualControl.ContentAlignment = base.ContentAlignment; + this.visualControl.StringTrimming = base.StringTrimming; + this.HandlePropertyChanged(e.PropertyName); } diff --git a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportTextItem.cs b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportTextItem.cs index 414b6bca24..95a54029e1 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportTextItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportTextItem.cs @@ -32,16 +32,17 @@ namespace SharpReport.ReportItems { visualControl = new ReportTextControl(); this.Text = visualControl.Name; - visualControl.StringFormat = base.StringFormat; - ItemsHelper.UpdateBaseFromTextControl (this.visualControl,this); + visualControl.ContentAlignment = base.ContentAlignment; + visualControl.StringTrimming = base.StringTrimming; + ItemsHelper.UpdateBaseFromTextControl (this.visualControl,this); + this.visualControl.Click += new EventHandler(OnControlSelect); this.visualControl.VisualControlChanged += new EventHandler (OnControlChanged); this.visualControl.BackColorChanged += new EventHandler (OnControlChanged); this.visualControl.FontChanged += new EventHandler (OnControlChanged); this.visualControl.ForeColorChanged += new EventHandler (OnControlChanged); - base.PropertyChanged += new PropertyChangedEventHandler (BasePropertyChange); } @@ -49,11 +50,14 @@ namespace SharpReport.ReportItems { #endregion - #region events + private void BasePropertyChange (object sender, PropertyChangedEventArgs e){ ItemsHelper.UpdateControlFromTextBase(this.visualControl,this); - this.visualControl.StringFormat = base.StringFormat; + + this.visualControl.ContentAlignment = base.ContentAlignment; + this.visualControl.StringTrimming = base.StringTrimming; + this.HandlePropertyChanged(e.PropertyName); } @@ -86,20 +90,7 @@ namespace SharpReport.ReportItems { } #endregion - - public override Size Size { - get { - return base.Size; - } - set { - base.Size = value; - if (this.visualControl != null) { - this.visualControl.Size = value; - } - this.HandlePropertyChanged("Size"); - } - } - + public override Point Location { get { return base.Location; @@ -142,7 +133,7 @@ namespace SharpReport.ReportItems { this.HandlePropertyChanged("Text"); } } - + #region IDesignable [System.Xml.Serialization.XmlIgnoreAttribute] diff --git a/src/AddIns/Misc/SharpReport/SharpReport/Visitors/LoadReportVisitor.cs b/src/AddIns/Misc/SharpReport/SharpReport/Visitors/LoadReportVisitor.cs index a78dba8a06..05d19a65e7 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/Visitors/LoadReportVisitor.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/Visitors/LoadReportVisitor.cs @@ -115,7 +115,10 @@ namespace SharpReport.Visitors { itemRenderer = designableFactory.Create(ctrlElem.GetAttribute("type")); baseReportItem = (BaseReportItem)itemRenderer; - + + baseReportItem.SuspendLayout(); + XmlHelper.SetReportItemValues (base.XmlFormReader,ctrlElem,baseReportItem); + if (parentContainer == null) { baseReportItem.Parent = baseSection; baseSection.Items.Add (baseReportItem); @@ -124,9 +127,7 @@ namespace SharpReport.Visitors { parentContainer.Items.Add(baseReportItem); } - - XmlHelper.SetReportItemValues (base.XmlFormReader,ctrlElem,baseReportItem); - + baseReportItem.ResumeLayout(); IContainerItem iContainer = baseReportItem as IContainerItem; if (iContainer != null) { diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseDataItem.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseDataItem.cs index 75f44f3372..c38f2a0983 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseDataItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseDataItem.cs @@ -66,11 +66,10 @@ namespace SharpReportCore { // this.DbValue is formatted in the BeforePrintEvent catched in AbstractRenderer string toPrint = CheckForNullValue(); - string formattedString = base.FireFormatOutput(toPrint,this.FormatString,""); - - RectangleF rect = base.PrepareRectangle (rpea,formattedString); - base.PrintTheStuff (rpea,formattedString,rect); - base.NotiyfyAfterPrint (rpea.LocationAfterDraw); + + base.Text = base.FireFormatOutput(toPrint,this.FormatString,""); + base.Render (rpea); + } public override string ToString() { diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseReportItem.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseReportItem.cs index e342b97d8a..fd9992fc38 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseReportItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseReportItem.cs @@ -60,14 +60,17 @@ namespace SharpReportCore { #endregion #region EventHandling + protected void NotiyfyAfterPrint (PointF afterPrintLocation) { +// System.Console.WriteLine("\tNotiyfyAfterPrint"); if (this.ItemPrinted != null) { AfterPrintEventArgs rea = new AfterPrintEventArgs (afterPrintLocation); ItemPrinted(this, rea); } } - protected void NotifyBeforePrint () { + private void NotifyBeforePrint () { +// System.Console.WriteLine("\tNotifyBeforePrint"); if (this.ItemPrinting != null) { BeforePrintEventArgs ea = new BeforePrintEventArgs (); ItemPrinting (this,ea); @@ -75,6 +78,15 @@ namespace SharpReportCore { } #endregion + + #region overrides + public override void Render(ReportPageEventArgs rpea){ + base.Render(rpea); + this.NotifyBeforePrint(); + } + + #endregion + #region virtual method's protected RectangleF DrawingRectangle (ReportPageEventArgs e,SizeF measureSize) { @@ -145,7 +157,7 @@ namespace SharpReportCore { NotifyPropertyChanged ("Font"); } } - + #endregion #region IDisposeable diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseTextItem.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseTextItem.cs index 0ff7465971..b800ff6343 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseTextItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseTextItem.cs @@ -32,6 +32,7 @@ namespace SharpReportCore { private ContentAlignment contentAlignment; #region Constructor + public BaseTextItem():base() { this.stringFormat = StringFormat.GenericTypographic; this.contentAlignment = ContentAlignment.MiddleLeft; @@ -40,85 +41,19 @@ namespace SharpReportCore { #endregion - private StringFormat BuildStringFormat(){ - StringFormat format = StringFormat.GenericTypographic; - format.Trimming = this.stringTrimming; - format.FormatFlags = StringFormatFlags.LineLimit; - -// if (base.RightToLeft) -// { -// format1.FormatFlags |= StringFormatFlags.DirectionRightToLeft; -// } - - ContentAlignment alignment = this.contentAlignment; - if (alignment <= ContentAlignment.MiddleCenter){ - switch (alignment){ - case ContentAlignment.TopLeft:{ - format.Alignment = StringAlignment.Near; - format.LineAlignment = StringAlignment.Near; - return format; - } - case ContentAlignment.TopCenter:{ - format.Alignment = StringAlignment.Center; - format.LineAlignment = StringAlignment.Near; - return format; - } - case (ContentAlignment.TopCenter | ContentAlignment.TopLeft):{ - return format; - } - case ContentAlignment.TopRight:{ - format.Alignment = StringAlignment.Far; - format.LineAlignment = StringAlignment.Near; - return format; - } - case ContentAlignment.MiddleLeft:{ - format.Alignment = StringAlignment.Near; - format.LineAlignment = StringAlignment.Center; - return format; - } - case ContentAlignment.MiddleCenter:{ - format.Alignment = StringAlignment.Center; - format.LineAlignment = StringAlignment.Center; - return format; - } - } - return format; - } - if (alignment <= ContentAlignment.BottomLeft){ - if (alignment == ContentAlignment.MiddleRight){ - format.Alignment = StringAlignment.Far; - format.LineAlignment = StringAlignment.Center; - return format; - } - if (alignment != ContentAlignment.BottomLeft){ - return format; - } - } - else{ - if (alignment != ContentAlignment.BottomCenter){ - if (alignment == ContentAlignment.BottomRight) - { - format.Alignment = StringAlignment.Far; - format.LineAlignment = StringAlignment.Far; - } - return format; - } - format.Alignment = StringAlignment.Center; - format.LineAlignment = StringAlignment.Far; - return format; - } - format.Alignment = StringAlignment.Near; - format.LineAlignment = StringAlignment.Far; - return format; - } - public override void Render(ReportPageEventArgs rpea) { + if (rpea == null) { throw new ArgumentNullException("rpea"); } + base.Render(rpea); RectangleF rect = PrepareRectangle (rpea,this.Text); + FillBackGround (rpea.PrintPageEventArgs.Graphics, + rect); + DrawFrame (rpea.PrintPageEventArgs.Graphics, + Rectangle.Ceiling (rect)); PrintTheStuff (rpea,this.Text,rect); base.NotiyfyAfterPrint (rpea.LocationAfterDraw); } @@ -127,22 +62,29 @@ namespace SharpReportCore { return "BaseTextItem"; } - private void Decorate (ReportPageEventArgs rpea,Rectangle border) { + protected void FillBackGround (Graphics graphics,RectangleF rectangle) { using (SolidBrush brush = new SolidBrush(base.BackColor)) { - rpea.PrintPageEventArgs.Graphics.FillRectangle(brush,border); + graphics.FillRectangle(brush,rectangle); } + } + + protected void DrawFrame (Graphics graphics,Rectangle border) { if (base.DrawBorder == true) { using (Pen pen = new Pen(Color.Black, 1)) { - rpea.PrintPageEventArgs.Graphics.DrawRectangle (pen,border); + graphics.DrawRectangle (pen,border); } + //TODO use this class to draw a border +// RectangleShape shape = new RectangleShape(); +// shape.DrawShape (graphics, +// new BaseLine (this.ForeColor,System.Drawing.Drawing2D.DashStyle.Solid,1), +// border); } } - protected RectangleF PrepareRectangle (ReportPageEventArgs e,string text) { + protected RectangleF PrepareRectangle (ReportPageEventArgs rpea,string text) { SizeF measureSize = new SizeF (); - measureSize = MeasureReportItem (e,text); - RectangleF rect = base.DrawingRectangle (e,measureSize); - Decorate (e,System.Drawing.Rectangle.Ceiling (rect)); + measureSize = MeasureReportItem (rpea,text); + RectangleF rect = base.DrawingRectangle (rpea,measureSize); return rect; } @@ -172,20 +114,31 @@ namespace SharpReportCore { RectangleF rectangle ) { if (rpea == null) { - throw new ArgumentException (this.Name); + throw new ArgumentNullException("rpea"); } - StringFormat fmt = this.stringFormat; + textDrawer.DrawString(rpea.PrintPageEventArgs.Graphics, - toPrint, - this.Font, + toPrint,this.Font, new SolidBrush(this.ForeColor), rectangle, - fmt); - - rpea.LocationAfterDraw = new PointF (this.Location.X + this.Size.Width, + this.stringTrimming,this.contentAlignment); + + + rpea.LocationAfterDraw = new PointF (this.Location.X + this.Size.Width, this.Location.Y + this.Size.Height); } + + public virtual string Text { + get { + return text; + } + set { + text = value; + base.NotifyPropertyChanged("Text"); + } + } + /// /// Formatstring like in MSDN /// @@ -204,20 +157,8 @@ namespace SharpReportCore { } - public virtual string Text { - get { - return text; - } - set { - text = value; - base.NotifyPropertyChanged("Text"); - } - } - - - [Category("Appearance")] - public StringTrimming StringTrimming { + public StringTrimming StringTrimming { get { return stringTrimming; } @@ -237,12 +178,13 @@ namespace SharpReportCore { base.NotifyPropertyChanged("ContentAlignment"); } } - + [Browsable(false)] [XmlIgnoreAttribute] - public StringFormat StringFormat { + public virtual StringFormat StringFormat { get { - return this.BuildStringFormat(); + return this.textDrawer.BuildStringFormat (this.StringTrimming, + this.ContentAlignment); } } } diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/RowItem.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/RowItem.cs index 7239901b55..859a45318a 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/RowItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/RowItem.cs @@ -23,7 +23,7 @@ namespace SharpReportCore{ private ReportItemCollection items; private Padding padding; - private Color secondaryBackColor; + private Color alternateBackColor; private int changeBackColorEveryNRow; public RowItem():this (String.Empty){ @@ -64,7 +64,8 @@ namespace SharpReportCore{ if (rpea == null) { throw new ArgumentNullException("rpea"); } - + System.Console.WriteLine(""); + System.Console.WriteLine("--Start Row Item"); base.Render(rpea); RectangleF rect = PrepareRectangle (rpea); @@ -79,7 +80,8 @@ namespace SharpReportCore{ childItem.Render (rpea); childItem.Location = new Point(loc.X,loc.Y); } - + System.Console.WriteLine("--End of RowItem"); + System.Console.WriteLine(""); base.NotiyfyAfterPrint (rpea.LocationAfterDraw); } @@ -96,12 +98,12 @@ namespace SharpReportCore{ [Category("Appearance"), Description("Change the Backcolor on every 'N' Row")] - public Color SecondaryBackColor { + public Color AlternateBackColor { get { - return this.secondaryBackColor; + return this.alternateBackColor; } set { - this.secondaryBackColor = value; + this.alternateBackColor = value; base.NotifyPropertyChanged("SecondaryBackColor"); } } diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Text/TextDrawer.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Text/TextDrawer.cs index 56eab54358..11cfa921b4 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Text/TextDrawer.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Text/TextDrawer.cs @@ -38,12 +38,102 @@ namespace SharpReportCore { } - public void DrawString(Graphics graphics,string text,Font font,Brush brush,RectangleF rectangle,StringFormat stringFormat) { + public void DrawString(Graphics graphics,string text, + Font font,Brush brush, + RectangleF rectangle, + StringFormat stringFormat) { + graphics.DrawString(text, font, brush, rectangle, stringFormat); } + + + public void DrawString(Graphics graphics,string text, + Font font,Brush brush, + RectangleF rectangle, + StringTrimming stringTrimming, + ContentAlignment alignment) { + + StringFormat s = BuildStringFormat(stringTrimming,alignment); + this.DrawString(graphics,text, + font,brush, + rectangle, + s); + } + + + public StringFormat BuildStringFormat(StringTrimming stringTrimming,ContentAlignment alignment){ + StringFormat format = StringFormat.GenericTypographic; + format.Trimming = stringTrimming; + format.FormatFlags = StringFormatFlags.LineLimit; + +// if (base.RightToLeft) +// { +// format1.FormatFlags |= StringFormatFlags.DirectionRightToLeft; +// } + + if (alignment <= ContentAlignment.MiddleCenter){ + switch (alignment){ + case ContentAlignment.TopLeft:{ + format.Alignment = StringAlignment.Near; + format.LineAlignment = StringAlignment.Near; + return format; + } + case ContentAlignment.TopCenter:{ + format.Alignment = StringAlignment.Center; + format.LineAlignment = StringAlignment.Near; + return format; + } + case (ContentAlignment.TopCenter | ContentAlignment.TopLeft):{ + return format; + } + case ContentAlignment.TopRight:{ + format.Alignment = StringAlignment.Far; + format.LineAlignment = StringAlignment.Near; + return format; + } + case ContentAlignment.MiddleLeft:{ + format.Alignment = StringAlignment.Near; + format.LineAlignment = StringAlignment.Center; + return format; + } + case ContentAlignment.MiddleCenter:{ + format.Alignment = StringAlignment.Center; + format.LineAlignment = StringAlignment.Center; + return format; + } + } + return format; + } + if (alignment <= ContentAlignment.BottomLeft){ + if (alignment == ContentAlignment.MiddleRight){ + format.Alignment = StringAlignment.Far; + format.LineAlignment = StringAlignment.Center; + return format; + } + if (alignment != ContentAlignment.BottomLeft){ + return format; + } + } + else{ + if (alignment != ContentAlignment.BottomCenter){ + if (alignment == ContentAlignment.BottomRight) + { + format.Alignment = StringAlignment.Far; + format.LineAlignment = StringAlignment.Far; + } + return format; + } + format.Alignment = StringAlignment.Center; + format.LineAlignment = StringAlignment.Far; + return format; + } + format.Alignment = StringAlignment.Near; + format.LineAlignment = StringAlignment.Far; + return format; + } } } diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/ReportSettings.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/ReportSettings.cs index 676762d638..4d35219e5a 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/ReportSettings.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/ReportSettings.cs @@ -48,7 +48,7 @@ namespace SharpReportCore{ private System.Data.CommandType commandType; private Font defaultFont = new Font("Microsoft Sans Serif", - 16, + 10, FontStyle.Regular, GraphicsUnit.Point); diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/Xml/XmlHelper.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/Xml/XmlHelper.cs index 751fbfa4e0..a1634f9aa2 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/Xml/XmlHelper.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/Xml/XmlHelper.cs @@ -121,6 +121,7 @@ namespace SharpReportCore { XmlElement ctrlElem, BaseReportItem item) { + item.SuspendLayout(); try { XmlNodeList nodeList = ctrlElem.ChildNodes; foreach (XmlNode node in nodeList) { @@ -130,7 +131,6 @@ namespace SharpReportCore { if (elem.Name == "Font") { item.Font = XmlFormReader.MakeFont (elem.GetAttribute("value")); } - reader.SetValue (item, elem.Name,elem.GetAttribute("value")); } @@ -138,6 +138,8 @@ namespace SharpReportCore { } } catch (Exception) { throw; + } finally { + item.ResumeLayout(); } } } From 8a7e7df011683567c10c65957c6345d3d1baa140 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 27 Apr 2006 16:13:48 +0000 Subject: [PATCH 17/49] Fixed SD2-789: Search window loses focus git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1355 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs index 6aecd4c068..6323f1bf47 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs @@ -134,6 +134,10 @@ namespace ICSharpCode.SharpDevelop.Gui private void CreateViewTabControl() { viewTabControl = new TabControl(); + viewTabControl.GotFocus += delegate { + TabPage page = viewTabControl.TabPages[viewTabControl.TabIndex]; + if (page.Controls.Count == 1 && !page.ContainsFocus) page.Controls[0].Focus(); + }; viewTabControl.Alignment = TabAlignment.Bottom; viewTabControl.Dock = DockStyle.Fill; viewTabControl.Selected += viewTabControlSelected; @@ -386,10 +390,6 @@ namespace ICSharpCode.SharpDevelop.Gui public virtual void OnWindowSelected(EventArgs e) { - if (viewTabControl != null) { - TabPage page = viewTabControl.TabPages[viewTabControl.TabIndex]; - if (page.Controls.Count == 1 && !page.ContainsFocus) page.Controls[0].Focus(); - } if (WindowSelected != null) { WindowSelected(this, e); } From 31f58f9a133dbca025b9b04dc93e89ff29705f43 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 27 Apr 2006 17:28:01 +0000 Subject: [PATCH 18/49] Update to Boo 0.7.6. Fixed various bugs in Boo code completion. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1356 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Boo/BooBinding/Project/Src/BooProject.cs | 7 ++ .../Project/Src/CodeCompletion/BooResolver.cs | 13 ++ .../CodeCompletion/VariableLookupVisitor.cs | 14 ++- .../Boo/BooBinding/Test/ResolverTests.cs | 118 ++++++++++++++++-- 4 files changed, 139 insertions(+), 13 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs index 8905c4013f..fb1d739860 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs @@ -102,5 +102,12 @@ namespace Grunwald.BooBinding return BooAmbience.Instance; } } + + [Browsable(false)] + public bool Ducky { + get { + return GetProperty("Ducky", false); + } + } } } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs index ac706d6028..317bd23394 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs @@ -63,6 +63,19 @@ namespace Grunwald.BooBinding.CodeCompletion return cu; } } + + /// + /// Gets if duck typing is enabled for the Boo project. + /// + public bool IsDucky { + get { + BooProject p = pc.Project as BooProject; + if (p != null) + return p.Ducky; + else + return false; + } + } #endregion #region Initialization diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs index fe3d985e40..2125022648 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs @@ -26,25 +26,27 @@ namespace Grunwald.BooBinding.CodeCompletion DeclarationFound(node.Declaration.Name, node.Declaration.Type, node.Initializer, node.LexicalInfo); } - LexicalInfo GetEndSourceLocation(Node node) + SourceLocation GetEndSourceLocation(Node node) { - if (node.LexicalInfo.IsValid) return node.LexicalInfo; + if (node.EndSourceLocation.IsValid) return node.EndSourceLocation; if (node is CallableBlockExpression) { return GetEndSourceLocation((node as CallableBlockExpression).Body); + } else if (node is ForStatement) { + return GetEndSourceLocation((node as ForStatement).Block); } else if (node is Block) { StatementCollection st = (node as Block).Statements; if (st.Count > 0) { return GetEndSourceLocation(st[st.Count - 1]); } } - return node.LexicalInfo; + return node.EndSourceLocation; } public override void OnCallableBlockExpression(CallableBlockExpression node) { if (node.LexicalInfo.Line <= resolver.CaretLine && GetEndSourceLocation(node).Line >= resolver.CaretLine - 1) { foreach (ParameterDeclaration param in node.Parameters) { - DeclarationFound(param.Name, param.Type, null, param.LexicalInfo); + DeclarationFound(param.Name, param.Type ?? (resolver.IsDucky ? new SimpleTypeReference("duck") : new SimpleTypeReference("object")), null, param.LexicalInfo); } base.OnCallableBlockExpression(node); } @@ -225,7 +227,9 @@ namespace Grunwald.BooBinding.CodeCompletion if (declarationType != null) { Add(declarationName, declarationType); } else if (initializer != null) { - Add(declarationName, initializer, false); + if (!knownVariableNames.Contains(declarationName)) { + Add(declarationName, initializer, false); + } } } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs index a453a028b4..f1acccad45 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -52,9 +52,10 @@ namespace Grunwald.BooBinding.Tests booLangPC.ReferencedContents.Add(ProjectContentRegistry.Mscorlib); } - ResolveResult Resolve(string prog, ExpressionResult er, string marker) + const string fileName = "tempFile.boo"; + + void Register(string prog) { - const string fileName = "tempFile.boo"; DefaultProjectContent pc = new DefaultProjectContent(); ParserService.ForceProjectContent(pc); pc.ReferencedContents.Add(ProjectContentRegistry.Mscorlib); @@ -63,10 +64,13 @@ namespace Grunwald.BooBinding.Tests ICompilationUnit cu = new BooParser().Parse(pc, fileName, prog); ParserService.UpdateParseInformation(cu, fileName, false, false); cu.Classes.ForEach(pc.AddClassToNamespaceList); - + } + + void GetPos(string prog, string marker, out int line, out int column) + { int index = prog.IndexOf(marker); - int line = 1; - int column = 0; + line = 1; + column = 0; for (int i = 0; i < index; i++) { column++; if (prog[i]=='\n') { @@ -74,6 +78,13 @@ namespace Grunwald.BooBinding.Tests column = 0; } } + } + + ResolveResult Resolve(string prog, ExpressionResult er, string marker) + { + Register(prog); + int line, column; + GetPos(prog, marker, out line, out column); BooResolver r = new BooResolver(); return r.Resolve(er, line, column, fileName, prog); @@ -91,8 +102,8 @@ namespace Grunwald.BooBinding.Tests "\t/*2*/\n" + "\tclosure2 = def(e as DateTime):\n" + "\t\treturn e.Year\n" + - "\trecursiveClosure = def():\n" + - "\t\treturn recursiveClosure()\n" + + "\trecursiveClosure = def(myObject):/*inRecursiveClosure*/\n" + + "\t\treturn recursiveClosure(myObject)\n" + "\t/*3*/\n"; [Test] @@ -162,7 +173,14 @@ namespace Grunwald.BooBinding.Tests // preventing the StackOverflow. LocalResolveResult rr = Resolve("recursiveClosure", "/*3*/"); Assert.IsFalse(rr.IsParameter); - Assert.AreEqual("delegate():?", rr.ResolvedType.FullyQualifiedName); + Assert.AreEqual("delegate(myObject:Object):?", rr.ResolvedType.FullyQualifiedName); + } + + [Test] + public void ClosureTypelessArgument() + { + LocalResolveResult rr = Resolve("myObject", "/*inRecursiveClosure*/"); + Assert.AreEqual("System.Object", rr.ResolvedType.FullyQualifiedName); } #endregion @@ -196,5 +214,89 @@ namespace Grunwald.BooBinding.Tests Assert.IsNull(Resolve(regressionProg, new ExpressionResult("boo640a"), "/*1*/")); } #endregion + + #region CtrlSpace + void CtrlSpace(string prog, params string[] expected) + { + CtrlSpace(new string[0], prog, expected); + } + + void CtrlSpace(string[] unExpected, string prog, params string[] expected) + { + Register(prog); + int line, column; + GetPos(prog, "/*mark*/", out line, out column); + BooResolver r = new BooResolver(); + System.Collections.ArrayList ar; + ar = r.CtrlSpace(line, column, fileName, prog, ExpressionContext.Default); + foreach (string e in unExpected) { + foreach (object o in ar) { + if (e.Equals(o)) + Assert.Fail("Didn't expect " + e); + if (o is IMember && (o as IMember).Name == e) { + Assert.Fail("Didn't expect " + e); + } + if (o is IClass && (o as IClass).Name == e) { + Assert.Fail("Didn't expect " + e); + } + } + } + foreach (string e in expected) { + bool ok = false; + foreach (object o in ar) { + if (e.Equals(o)) { + if (ok) Assert.Fail("double entry " + e); + ok = true; + } + if (o is IMember && (o as IMember).Name == e) { + if (ok) Assert.Fail("double entry " + e); + ok = true; + } + if (o is IClass && (o as IClass).Name == e) { + if (ok) Assert.Fail("double entry " + e); + ok = true; + } + } + if (!ok) + Assert.Fail("Expected " + e); + } + } + + [Test] + public void CtrlSpaceScopeExtension() + { + string prog = + "def Foo():\n" + + "\tbar = def():\n" + + "\t\tx = 0\n" + + "\t\t/*mark*/\n"; + CtrlSpace(prog, "bar", "x"); + } + + [Test] + public void DoubleEntryTest() + { + string prog = + "class MyClass:\n" + + "\t_myInt = 0\n" + + "\tdef Foo():\n" + + "\t\t_myInt = 5\n" + + "\t\t/*mark*/\n"; + CtrlSpace(prog, "_myInt"); + } + + [Test] + public void LoopInClosureTest() + { + string prog = + "def Foo():\n" + + "\tfor i in range(5):\n" + + "\t\tbar = def():\n" + + "\t\t\tx = 0\n" + + "\t\t\t/*mark*/\n" + + "\t\t\tprint x"; + CtrlSpace(prog, "x", "bar", "i"); + } + #endregion } } From 06f093be9a12da5eb03fb74658a288b87320e4c0 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 27 Apr 2006 17:47:02 +0000 Subject: [PATCH 19/49] Fixed forum-7077 (Boo code completion) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1357 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/CodeCompletion/BooResolver.cs | 17 ++++++----- .../Src/CodeCompletion/ResolveVisitor.cs | 20 +++++++++---- .../Boo/BooBinding/Test/ResolverTests.cs | 30 +++++++++++++++++++ .../Base/Project/Src/Dom/ResolveResult.cs | 7 +++++ 4 files changed, 62 insertions(+), 12 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs index 317bd23394..1a6d51d429 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs @@ -286,18 +286,18 @@ namespace Grunwald.BooBinding.CodeCompletion public ArrayList CtrlSpace(int caretLine, int caretColumn, string fileName, string fileContent, ExpressionContext context) { - ArrayList result; + ArrayList result = new ArrayList(); if (!Initialize(fileName, caretLine, caretColumn)) return null; if (context == ExpressionContext.Importable) { - result = new ArrayList(); pc.AddNamespaceContents(result, "", pc.Language, true); NRResolver.AddUsing(result, pc.DefaultImports, pc); return result; } - result = GetImportedNamespaceContents(); + NRResolver.AddContentsFromCalling(result, callingClass, callingMember); + AddImportedNamespaceContents(result); if (BooProject.BooCompilerPC != null) { if (context == ExpressionFinder.BooAttributeContext.Instance) { @@ -317,8 +317,6 @@ namespace Grunwald.BooBinding.CodeCompletion } } - NRResolver.AddContentsFromCalling(result, callingClass, callingMember); - List knownVariableNames = new List(); foreach (object o in result) { IMember m = o as IMember; @@ -338,14 +336,19 @@ namespace Grunwald.BooBinding.CodeCompletion // used by ctrl+space and resolve visitor (resolve identifier) public ArrayList GetImportedNamespaceContents() { - ArrayList list = new ArrayList(); + ArrayList result = new ArrayList(); + AddImportedNamespaceContents(result); + return result; + } + + void AddImportedNamespaceContents(ArrayList list) + { IClass c; foreach (KeyValuePair pair in BooAmbience.TypeConversionTable) { c = GetPrimitiveClass(pc, pair.Key, pair.Value); if (c != null) list.Add(c); } NRResolver.AddImportedNamespaceContents(list, cu, callingClass); - return list; } #endregion } 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 235486c7df..8097adf281 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs @@ -361,19 +361,28 @@ namespace Grunwald.BooBinding.CodeCompletion { ClearResult(); node.Target.Accept(this); + if (resolveResult is MixedResolveResult) { + MixedResolveResult mixed = (MixedResolveResult)resolveResult; + resolveResult = mixed.TypeResult; + foreach (ResolveResult rr in mixed.Results) { + if (rr is MethodResolveResult) { + resolveResult = rr; + break; + } + } + } if (resolveResult == null) return; + if (resolveResult is MethodResolveResult) { // normal method call string methodName = ((MethodResolveResult)resolveResult).Name; IReturnType containingType = ((MethodResolveResult)resolveResult).ContainingType; ResolveMethodInType(containingType, methodName, node.Arguments); - } else if (resolveResult is TypeResolveResult || resolveResult is MixedResolveResult) { - TypeResolveResult trr = resolveResult as TypeResolveResult; - if (trr == null) - trr = (resolveResult as MixedResolveResult).TypeResult; - if (trr != null && trr.ResolvedClass != null) { + } else if (resolveResult is TypeResolveResult) { + TypeResolveResult trr = (TypeResolveResult)resolveResult; + if (trr.ResolvedClass != null) { if (trr.ResolvedClass.FullyQualifiedName == "array") { ResolveArrayCreation(node.Arguments); return; @@ -535,6 +544,7 @@ namespace Grunwald.BooBinding.CodeCompletion switch (node.Operator) { case BinaryOperatorType.GreaterThan: case BinaryOperatorType.GreaterThanOrEqual: + case BinaryOperatorType.Equality: case BinaryOperatorType.Inequality: case BinaryOperatorType.LessThan: case BinaryOperatorType.LessThanOrEqual: diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs index f1acccad45..e0894a6252 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -182,6 +182,36 @@ namespace Grunwald.BooBinding.Tests LocalResolveResult rr = Resolve("myObject", "/*inRecursiveClosure*/"); Assert.AreEqual("System.Object", rr.ResolvedType.FullyQualifiedName); } + + [Test] + public void EqualityOperator() + { + ResolveResult rr = Resolve("0 == 0"); + Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName); + rr = Resolve("0 != 1"); + Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName); + rr = Resolve("null is null"); + Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName); + rr = Resolve("object() is not null"); + Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName); + } + + [Test] + public void ClassMethodAmbiguity() + { + string prog = + "class Test:\n" + + "\tdef constructor():\n" + + "\t\tpass\n" + + "class OtherClass:\n" + + "\tdef Test():\n" + + "\t\t/*mark*/\n" + + "\t\tpass\n"; + ResolveResult rr = Resolve(prog, new ExpressionResult("Test()"), "/*mark*/"); + Assert.IsNotNull(rr); + Assert.IsInstanceOfType(typeof(MemberResolveResult), rr); + Assert.AreEqual("OtherClass.Test", (rr as MemberResolveResult).ResolvedMember.FullyQualifiedName); + } #endregion #region Regression diff --git a/src/Main/Base/Project/Src/Dom/ResolveResult.cs b/src/Main/Base/Project/Src/Dom/ResolveResult.cs index da236f28e7..b4faf42fa6 100644 --- a/src/Main/Base/Project/Src/Dom/ResolveResult.cs +++ b/src/Main/Base/Project/Src/Dom/ResolveResult.cs @@ -214,6 +214,13 @@ namespace ICSharpCode.SharpDevelop.Dom } } + public IEnumerable Results { + get { + yield return primaryResult; + yield return secondaryResult; + } + } + public TypeResolveResult TypeResult { get { if (primaryResult is TypeResolveResult) From 990e3eedc6ce5034af5211732eca3453139e6f93 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 27 Apr 2006 18:13:38 +0000 Subject: [PATCH 20/49] Code completion for variables defined in except-clauses. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1358 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/CodeCompletion/VariableLookupVisitor.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs index 2125022648..ac78889419 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs @@ -33,6 +33,8 @@ namespace Grunwald.BooBinding.CodeCompletion return GetEndSourceLocation((node as CallableBlockExpression).Body); } else if (node is ForStatement) { return GetEndSourceLocation((node as ForStatement).Block); + } else if (node is ExceptionHandler) { + return GetEndSourceLocation((node as ExceptionHandler).Block); } else if (node is Block) { StatementCollection st = (node as Block).Statements; if (st.Count > 0) { @@ -103,6 +105,14 @@ namespace Grunwald.BooBinding.CodeCompletion } } } + + public override void OnExceptionHandler(ExceptionHandler node) + { + if (node.LexicalInfo.Line <= resolver.CaretLine && GetEndSourceLocation(node).Line >= resolver.CaretLine) { + DeclarationFound(node.Declaration.Name, node.Declaration.Type ?? new SimpleTypeReference("System.Exception"), null, node.Declaration.LexicalInfo); + } + base.OnExceptionHandler(node); + } } /// From f8a7e02e13ad227855d75bb5763d17d9131a3ca4 Mon Sep 17 00:00:00 2001 From: Peter Forstmeier Date: Fri, 28 Apr 2006 06:29:35 +0000 Subject: [PATCH 21/49] Visual Controls and ReportItems now use the same drawing functions git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1359 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Designer/VisualControls/ControlHelper.cs | 2 +- .../VisualControls/ReportControlBase.cs | 4 ++ .../VisualControls/ReportLineControl.cs | 2 +- .../VisualControls/ReportRectangleControl.cs | 6 +-- .../VisualControls/ReportRowControl.cs | 23 +++++++-- .../VisualControls/ReportTextControl.cs | 19 ++++++- .../ReportItems/TextBased/ItemsHelper.cs | 1 - .../ReportItems/TextBased/ReportRowItem.cs | 4 +- .../ReportItems/TextBased/ReportTextItem.cs | 1 + .../SharpReportCore/BaseItems/BaseTextItem.cs | 23 ++++----- .../BaseItems/Graphics/BaseRectangleItem.cs | 4 +- .../SharpReportCore/BaseItems/RowItem.cs | 29 ++++++----- .../Printing/Graphics/BaseLine.cs | 49 +++++++++++++++++-- .../Printing/Graphics/BaseShape.cs | 40 ++++++++++----- .../Printing/Graphics/EllipseShape.cs | 19 +++---- .../Printing/Graphics/FillPatterns.cs | 10 +++- .../Printing/Graphics/LineShape.cs | 22 +++------ .../Printing/Graphics/RectangleShape.cs | 27 +++------- 18 files changed, 174 insertions(+), 111 deletions(-) diff --git a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ControlHelper.cs b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ControlHelper.cs index 72e3ac78f0..60a11f051b 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ControlHelper.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ControlHelper.cs @@ -15,7 +15,7 @@ namespace SharpReport.Designer /// /// Description of ControlHelper. /// - internal class ControlHelper{ + public class ControlHelper{ Control control; public ControlHelper(Control control){ diff --git a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportControlBase.cs b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportControlBase.cs index 71a1ea8781..94a5240d2b 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportControlBase.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportControlBase.cs @@ -129,6 +129,10 @@ namespace SharpReport.Designer{ this.Invalidate(); } + protected Rectangle FocusRectangle { + get {return this.controlHelper.BuildFocusRectangle;} + } + #region Windows Forms Designer generated code /// /// This method is required for Windows Forms designer support. diff --git a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportLineControl.cs b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportLineControl.cs index 42b4ffa126..0f78bb8df6 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportLineControl.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportLineControl.cs @@ -39,7 +39,7 @@ namespace SharpReport.Designer{ protected override void OnPaint(System.Windows.Forms.PaintEventArgs pea) { base.OnPaint(pea); base.DrawEdges (pea); - base.DrawDecorations(pea); +// base.DrawDecorations(pea); shape.DrawShape(pea.Graphics, new BaseLine (this.ForeColor,base.DashStyle,base.Thickness), diff --git a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportRectangleControl.cs b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportRectangleControl.cs index 0b0763aa45..8209227905 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportRectangleControl.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportRectangleControl.cs @@ -41,15 +41,15 @@ namespace SharpReport.Designer { protected override void OnPaint(System.Windows.Forms.PaintEventArgs pea) { base.OnPaint(pea); - base.DrawEdges (pea); base.DrawDecorations(pea); + shape.FillShape(pea.Graphics, new SolidFillPattern(this.BackColor), - (RectangleF)this.ClientRectangle); + (RectangleF)base.FocusRectangle); shape.DrawShape (pea.Graphics, new BaseLine (this.ForeColor,base.DashStyle,base.Thickness), - (RectangleF)this.ClientRectangle); + (RectangleF)base.FocusRectangle); } diff --git a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportRowControl.cs b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportRowControl.cs index 0ffed654de..498f7b6e5e 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportRowControl.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportRowControl.cs @@ -21,7 +21,8 @@ namespace SharpReport.Designer{ /// internal class ReportRowControl:ReportControlBase{ - + private RectangleShape shape = new RectangleShape(); + private bool drawBorder; public ReportRowControl():base(){ InitializeComponent(); this.SetStyle(ControlStyles.DoubleBuffer | @@ -39,10 +40,15 @@ namespace SharpReport.Designer{ #region overrides protected override void OnPaint(System.Windows.Forms.PaintEventArgs pea){ base.OnPaint(pea); - - Rectangle r = new Rectangle(0,5,this.ClientSize.Width - 1,this.ClientSize.Height - 6); - base.DrawEdges (pea,r); + base.DrawEdges (pea, + new Rectangle(0,5,this.ClientSize.Width - 1,this.ClientSize.Height - 6) ); base.DrawDecorations(pea); + + if (this.drawBorder) { + shape.DrawShape (pea.Graphics, + new BaseLine (this.ForeColor,System.Drawing.Drawing2D.DashStyle.Solid,1), + base.FocusRectangle); + } StringFormat fmt = GlobalValues.StandartStringFormat(); fmt.LineAlignment = StringAlignment.Near; @@ -54,11 +60,18 @@ namespace SharpReport.Designer{ } public override string ToString() { - return this.Name; + return this.GetType().Name; } #endregion + public bool DrawBorder { + set { + drawBorder = value; + this.Invalidate(); + } + } + #region Windows Forms Designer generated code /// /// This method is required for Windows Forms designer support. diff --git a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportTextControl.cs b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportTextControl.cs index c1b1ca503e..82f2464afc 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportTextControl.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/Designer/VisualControls/ReportTextControl.cs @@ -21,8 +21,10 @@ namespace SharpReport.Designer{ private StringTrimming stringTrimming; private ContentAlignment contentAlignment; - TextDrawer textDrawer = new TextDrawer(); + private bool drawBorder; + private TextDrawer textDrawer = new TextDrawer(); + private RectangleShape shape = new RectangleShape(); public ReportTextControl():base(){ InitializeComponent(); @@ -36,6 +38,12 @@ namespace SharpReport.Designer{ this.Size = GlobalValues.PreferedSize; } + public bool DrawBorder { + set { + drawBorder = value; + this.Invalidate(); + } + } @@ -61,7 +69,7 @@ namespace SharpReport.Designer{ } protected override void OnPaint(System.Windows.Forms.PaintEventArgs pea){ - + base.OnPaint(pea); base.DrawEdges (pea); base.DrawDecorations(pea); @@ -74,9 +82,16 @@ namespace SharpReport.Designer{ str = this.Text; } + if (this.drawBorder) { + shape.DrawShape (pea.Graphics, + new BaseLine (this.ForeColor,System.Drawing.Drawing2D.DashStyle.Solid,1), + base.FocusRectangle); + } + this.textDrawer.DrawString (pea.Graphics,this.Text,this.Font, new SolidBrush(this.ForeColor),(RectangleF)this.ClientRectangle, this.stringTrimming,this.contentAlignment); + } diff --git a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ItemsHelper.cs b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ItemsHelper.cs index 468da15ed0..85e3bc396f 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ItemsHelper.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ItemsHelper.cs @@ -53,7 +53,6 @@ namespace SharpReport { control.Size = item.Size; control.Font = item.Font; control.Name = item.Name; - BaseTextItem b = item as BaseTextItem; } diff --git a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportRowItem.cs b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportRowItem.cs index 45ff2ff93e..bbd7b10a09 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportRowItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportRowItem.cs @@ -108,6 +108,7 @@ namespace SharpReport.ReportItems private void BasePropertyChange (object sender, PropertyChangedEventArgs e){ ItemsHelper.UpdateControlFromTextBase (this.visualControl,this); + this.visualControl.DrawBorder = base.DrawBorder; this.HandlePropertyChanged(e.PropertyName); } @@ -115,6 +116,7 @@ namespace SharpReport.ReportItems private void OnControlChanged (object sender, EventArgs e) { this.SuspendLayout(); ItemsHelper.UpdateBaseFromTextControl (this.visualControl,this); + this.ResumeLayout(); this.HandlePropertyChanged("OnControlChanged"); @@ -206,7 +208,7 @@ namespace SharpReport.ReportItems } public override string ToString(){ - return this.Name; + return this.GetType().Name; } #endregion diff --git a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportTextItem.cs b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportTextItem.cs index 95a54029e1..a1739baa4f 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportTextItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReport/ReportItems/TextBased/ReportTextItem.cs @@ -57,6 +57,7 @@ namespace SharpReport.ReportItems { this.visualControl.ContentAlignment = base.ContentAlignment; this.visualControl.StringTrimming = base.StringTrimming; + this.visualControl.DrawBorder = base.DrawBorder; this.HandlePropertyChanged(e.PropertyName); } diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseTextItem.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseTextItem.cs index b800ff6343..bfaf0c8399 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseTextItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/BaseTextItem.cs @@ -30,6 +30,7 @@ namespace SharpReportCore { private StringTrimming stringTrimming; private TextDrawer textDrawer = new TextDrawer(); private ContentAlignment contentAlignment; + private RectangleShape shape = new RectangleShape(); #region Constructor @@ -63,27 +64,21 @@ namespace SharpReportCore { } protected void FillBackGround (Graphics graphics,RectangleF rectangle) { - using (SolidBrush brush = new SolidBrush(base.BackColor)) { - graphics.FillRectangle(brush,rectangle); - } + shape.FillShape(graphics, + new SolidFillPattern(this.BackColor), + rectangle); } - protected void DrawFrame (Graphics graphics,Rectangle border) { + protected void DrawFrame (Graphics graphics,Rectangle rectangle) { if (base.DrawBorder == true) { - using (Pen pen = new Pen(Color.Black, 1)) { - graphics.DrawRectangle (pen,border); - } - //TODO use this class to draw a border -// RectangleShape shape = new RectangleShape(); -// shape.DrawShape (graphics, -// new BaseLine (this.ForeColor,System.Drawing.Drawing2D.DashStyle.Solid,1), -// border); + shape.DrawShape (graphics, + new BaseLine (this.ForeColor,System.Drawing.Drawing2D.DashStyle.Solid,1), + rectangle); } } protected RectangleF PrepareRectangle (ReportPageEventArgs rpea,string text) { - SizeF measureSize = new SizeF (); - measureSize = MeasureReportItem (rpea,text); + SizeF measureSize = MeasureReportItem (rpea,text); RectangleF rect = base.DrawingRectangle (rpea,measureSize); return rect; } diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/Graphics/BaseRectangleItem.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/Graphics/BaseRectangleItem.cs index 36cb6ca0d5..7c1afbcce6 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/Graphics/BaseRectangleItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/Graphics/BaseRectangleItem.cs @@ -25,11 +25,9 @@ using System.Drawing; namespace SharpReportCore { public class BaseRectangleItem : SharpReportCore.BaseGraphicItem { - private ArrayList arrayList; RectangleShape shape = new RectangleShape(); public BaseRectangleItem() { - arrayList = new ArrayList(); } public override void Render(ReportPageEventArgs rpea) { @@ -39,7 +37,7 @@ namespace SharpReportCore { shape.FillShape(rpea.PrintPageEventArgs.Graphics, new SolidFillPattern(this.BackColor), rect); - + shape.DrawShape (rpea.PrintPageEventArgs.Graphics, new BaseLine (this.ForeColor,base.DashStyle,base.Thickness), rect); diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/RowItem.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/RowItem.cs index 859a45318a..91e9570ebc 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/RowItem.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/BaseItems/RowItem.cs @@ -9,6 +9,7 @@ using System; using System.Drawing; +using System.Drawing.Drawing2D; using System.ComponentModel; using System.Collections.Generic; using System.Windows.Forms; @@ -25,6 +26,8 @@ namespace SharpReportCore{ private Padding padding; private Color alternateBackColor; private int changeBackColorEveryNRow; + private RectangleShape shape = new RectangleShape(); + public RowItem():this (String.Empty){ } @@ -41,16 +44,7 @@ namespace SharpReportCore{ } #region overrides - private void Decorate (ReportPageEventArgs rpea,Rectangle border) { - using (SolidBrush brush = new SolidBrush(base.BackColor)) { - rpea.PrintPageEventArgs.Graphics.FillRectangle(brush,border); - } - if (base.DrawBorder == true) { - using (Pen pen = new Pen(Color.Black, 1)) { - rpea.PrintPageEventArgs.Graphics.DrawRectangle (pen,border); - } - } - } + protected RectangleF PrepareRectangle (ReportPageEventArgs e) { SizeF measureSize = new SizeF ((SizeF)this.Size); @@ -65,11 +59,20 @@ namespace SharpReportCore{ throw new ArgumentNullException("rpea"); } System.Console.WriteLine(""); - System.Console.WriteLine("--Start Row Item"); + System.Console.WriteLine("--Start of {0}",this.ToString()); base.Render(rpea); RectangleF rect = PrepareRectangle (rpea); - Decorate (rpea,System.Drawing.Rectangle.Ceiling (rect)); + shape.FillShape(rpea.PrintPageEventArgs.Graphics, + new SolidFillPattern(this.BackColor), + rect); + + if (base.DrawBorder == true) { + shape.DrawShape (rpea.PrintPageEventArgs.Graphics, + new BaseLine (this.ForeColor,System.Drawing.Drawing2D.DashStyle.Solid,1), + rect); + } + foreach (BaseReportItem childItem in this.items) { Point loc = new Point (childItem.Location.X,childItem.Location.Y); @@ -86,7 +89,7 @@ namespace SharpReportCore{ } public override string ToString(){ - return "RowItem"; + return this.GetType().Name; } #endregion diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/BaseLine.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/BaseLine.cs index 08d0cdc01e..bafc149c61 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/BaseLine.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/BaseLine.cs @@ -31,7 +31,7 @@ using System.Drawing.Drawing2D; /// created by - Forstmeier Peter /// created on - 09.10.2005 18:37:51 /// -namespace SharpReportCore { +namespace SharpReportCore { public class BaseLine : object { DashStyle dashStyle; @@ -45,10 +45,51 @@ namespace SharpReportCore { this.thickness = thickness; } - public void CreatePen () { - throw new NotImplementedException("BaseLine:CreatePen"); - } + public Pen CreatePen(){ + return this.CreatePen(72f); + } + + + public Pen CreatePen(float resolution) + { + Pen pen; + + if (this.thickness == 0f) + { + pen = new Pen(this.color, resolution / 72f); + } + else + { + pen = new Pen(this.color, (this.thickness * resolution) / 72f); + } + + switch (this.dashStyle){ + case DashStyle.Dot: + { + pen.DashStyle = DashStyle.Dot; + return pen; + } + case DashStyle.Dash: + { + pen.DashStyle = DashStyle.Dash; + return pen; + } + case DashStyle.DashDot: + { + pen.DashStyle = DashStyle.DashDot; + return pen; + } + case DashStyle.DashDotDot: + { + pen.DashStyle = DashStyle.DashDotDot; + return pen; + } + } + return pen; + } + + public Color Color { get { return color; diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/BaseShape.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/BaseShape.cs index d4df64c061..e4ed6a94a5 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/BaseShape.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/BaseShape.cs @@ -31,33 +31,47 @@ using System.Drawing.Drawing2D; /// namespace SharpReportCore { - public class BaseShape : object { + public abstract class BaseShape : object { public BaseShape() { } - public virtual void DrawShape (Graphics graphics,BaseLine baseLine,RectangleF rectangle) { + public void FillShape (Graphics graphics, Brush brush,RectangleF rectangle) { - } + GraphicsPath path1 = this.CreatePath(rectangle); + graphics.FillPath(brush, path1); - - public virtual void DrawShape (Graphics graphics,Pen pen,RectangleF rectangle) { + } + public void FillShape (Graphics graphics,AbstractFillPattern fillPattern,RectangleF rectangle) { + if (fillPattern != null){ + using (Brush brush = fillPattern.CreateBrush(rectangle)){ + if (brush != null){ + this.FillShape(graphics, brush, rectangle); + } + } + } } + public abstract GraphicsPath CreatePath (RectangleF rectangle) ; - public virtual void FillShape (Graphics graphics, Brush brush,RectangleF rectangle) { - - } - public virtual void FillShape (Graphics graphics,AbstractFillPattern fillPattern,RectangleF rectangle) { - - } - public virtual GraphicsPath CreatePath (RectangleF rectangleF) { - return null; + public void DrawShape(Graphics g, BaseLine line, RectangleF rectangle){ + using (Pen pen = line.CreatePen()){ + if (pen != null){ + this.new_DrawShape(g, pen, rectangle); + } + } + } + + public void new_DrawShape(Graphics g, Pen pen, RectangleF rectangle){ + GraphicsPath path1 = this.CreatePath(rectangle); + g.DrawPath(pen, path1); } + + } } diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/EllipseShape.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/EllipseShape.cs index 0d03939d91..4f31ce9fed 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/EllipseShape.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/EllipseShape.cs @@ -20,6 +20,8 @@ // Peter Forstmeier (Peter.Forstmeier@t-online.de) using System; using System.Drawing; +using System.Drawing.Drawing2D; + /// /// This class draws a Ellipse/Ellipse /// @@ -37,19 +39,10 @@ namespace SharpReportCore { } - public override void DrawShape(Graphics graphics, BaseLine baseLine, RectangleF rectangle) { - base.DrawShape(graphics,baseLine,rectangle); - using (Pen p = new Pen(baseLine.Color,baseLine.Thickness)) { - p.DashStyle = baseLine.DashStyle; - graphics.DrawEllipse(p, - rectangle); - } - } - - - public override void FillShape(Graphics graphics, AbstractFillPattern fillPattern, RectangleF rectangle) { - graphics.FillEllipse(fillPattern.Brush, - rectangle); + public override GraphicsPath CreatePath(RectangleF rectangle){ + GraphicsPath path = new GraphicsPath(); + path.AddEllipse(rectangle); + return path; } } diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/FillPatterns.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/FillPatterns.cs index 11a61702e3..f0550d4b02 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/FillPatterns.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/FillPatterns.cs @@ -39,7 +39,8 @@ namespace SharpReportCore { } - + public abstract Brush CreateBrush(RectangleF rect); + protected Color Color { get { return color; @@ -64,7 +65,12 @@ namespace SharpReportCore { /// public class SolidFillPattern : AbstractFillPattern { public SolidFillPattern (Color color) :base(color){ - base.Brush = new SolidBrush(color); +// base.Brush = new SolidBrush(color); } + + public override Brush CreateBrush(RectangleF rect){ + return new SolidBrush(this.Color); + } + } } diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/LineShape.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/LineShape.cs index bbdd5b744b..fe8579a3fc 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/LineShape.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/LineShape.cs @@ -20,7 +20,7 @@ // Peter Forstmeier (Peter.Forstmeier@t-online.de) using System; using System.Drawing; - +using System.Drawing.Drawing2D; /// /// Draw a Line, used by DesingerControls and printing stuff @@ -37,21 +37,13 @@ namespace SharpReportCore { /// public LineShape() { } + + public override GraphicsPath CreatePath(RectangleF rectangle){ + GraphicsPath path = new GraphicsPath(); + float halfRect = rectangle.Top + (rectangle.Height /2); + path.AddLine(rectangle.Left, halfRect, rectangle.Right, halfRect); + return path; - public override void DrawShape(Graphics graphics, BaseLine baseLine, RectangleF rectangle) { - base.DrawShape(graphics,baseLine,rectangle); - using (Pen p = new Pen(baseLine.Color,baseLine.Thickness)) { - p.DashStyle = baseLine.DashStyle; - float halfRect = rectangle.Top + (rectangle.Height / 2); - - graphics.DrawLine (p, - rectangle.X, - halfRect, - rectangle.X + rectangle.Width, - halfRect); - } } - - } } diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/RectangleShape.cs b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/RectangleShape.cs index d8cace4837..7f79fc5f84 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/RectangleShape.cs +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/Printing/Graphics/RectangleShape.cs @@ -20,6 +20,7 @@ // Peter Forstmeier (Peter.Forstmeier@t-online.de) using System; using System.Drawing; +using System.Drawing.Drawing2D; /// /// Draw a Rectangle, used by DesingerControls and printing stuff @@ -34,27 +35,13 @@ namespace SharpReportCore { public RectangleShape() { } - - public override void DrawShape(Graphics graphics, BaseLine baseLine, RectangleF rectangle) { - base.DrawShape(graphics,baseLine,rectangle); - using (Pen p = new Pen(baseLine.Color,baseLine.Thickness)) { - p.DashStyle = baseLine.DashStyle; - graphics.DrawRectangle (p,rectangle.Left, - rectangle.Top, - rectangle.Width, - rectangle.Height); - } - } - - public override void FillShape(Graphics graphics, AbstractFillPattern fillPattern, RectangleF rectangle) { - graphics.FillRectangle(fillPattern.Brush, - rectangle); - } - public override void FillShape(Graphics graphics, Brush brush, RectangleF rectangle) { - graphics.FillRectangle(brush, rectangle); - + public override GraphicsPath CreatePath(RectangleF rect){ + GraphicsPath path1 = new GraphicsPath(); + path1.AddRectangle(rect); + return path1; } - + + } } From f91811fe97c48571db90cb2173b9c55a5a687f8d Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 28 Apr 2006 16:16:01 +0000 Subject: [PATCH 22/49] Fixed SD2-524: Wildcards in MSBuild custom items are not interpreted git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1360 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Project/Items/FileProjectItem.cs | 8 +++++++ .../Src/Project/Items/ImportProjectItem.cs | 8 +++++++ .../Project/Src/Project/Items/ProjectItem.cs | 13 +++++++++++- .../Src/Project/Items/ReferenceProjectItem.cs | 8 +++++++ .../Src/Project/Items/UnknownProjectItem.cs | 10 ++++++++- .../Project/Src/Project/MSBuildProject.cs | 21 +++++++++++++++++++ .../Project/Src/Project/WebReferenceUrl.cs | 8 +++++++ 7 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/Main/Base/Project/Src/Project/Items/FileProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/FileProjectItem.cs index 2f81150bbc..8616ccdecb 100644 --- a/src/Main/Base/Project/Src/Project/Items/FileProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/FileProjectItem.cs @@ -131,5 +131,13 @@ namespace ICSharpCode.SharpDevelop.Project { this.type = type; } + + public override ProjectItem Clone() + { + ProjectItem n = new FileProjectItem(this.Project, this.ItemType); + n.Include = this.Include; + this.CopyExtraPropertiesTo(n); + return n; + } } } diff --git a/src/Main/Base/Project/Src/Project/Items/ImportProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ImportProjectItem.cs index 73fad4724e..395eb31bd8 100644 --- a/src/Main/Base/Project/Src/Project/Items/ImportProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/ImportProjectItem.cs @@ -23,5 +23,13 @@ namespace ICSharpCode.SharpDevelop.Project return ItemType.Import; } } + + public override ProjectItem Clone() + { + ImportProjectItem n = new ImportProjectItem(this.Project); + n.Include = this.Include; + this.CopyExtraPropertiesTo(n); + return n; + } } } diff --git a/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs index dcef5205d6..10d82d0481 100644 --- a/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs @@ -42,7 +42,7 @@ namespace ICSharpCode.SharpDevelop.Project BootstrapperFile } - public abstract class ProjectItem : LocalizedObject, IDisposable + public abstract class ProjectItem : LocalizedObject, IDisposable, ICloneable { string include; PropertyGroup properties = new PropertyGroup(); @@ -82,6 +82,17 @@ namespace ICSharpCode.SharpDevelop.Project item.Include = newInclude; } + public virtual ProjectItem Clone() + { + // TODO: Make me abstract in SD 2.1 + throw new NotSupportedException(); + } + + object ICloneable.Clone() + { + return this.Clone(); + } + [Browsable(false)] public PropertyGroup Properties { get { diff --git a/src/Main/Base/Project/Src/Project/Items/ReferenceProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ReferenceProjectItem.cs index 1a38678340..aa7a684017 100644 --- a/src/Main/Base/Project/Src/Project/Items/ReferenceProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/ReferenceProjectItem.cs @@ -169,5 +169,13 @@ namespace ICSharpCode.SharpDevelop.Project return null; } + + public override ProjectItem Clone() + { + ProjectItem n = new ReferenceProjectItem(this.Project); + n.Include = this.Include; + this.CopyExtraPropertiesTo(n); + return n; + } } } diff --git a/src/Main/Base/Project/Src/Project/Items/UnknownProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/UnknownProjectItem.cs index b8a2fd0731..f86b70b8a2 100644 --- a/src/Main/Base/Project/Src/Project/Items/UnknownProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/UnknownProjectItem.cs @@ -13,7 +13,7 @@ using ICSharpCode.Core; namespace ICSharpCode.SharpDevelop.Project { /// - /// Description of ReferenceProjectItem. + /// A project item whose type is not known by SharpDevelop. /// public class UnknownProjectItem : ProjectItem { @@ -35,5 +35,13 @@ namespace ICSharpCode.SharpDevelop.Project { this.tag = tag; } + + public override ProjectItem Clone() + { + ProjectItem n = new UnknownProjectItem(this.Project, this.Tag); + n.Include = this.Include; + this.CopyExtraPropertiesTo(n); + return n; + } } } diff --git a/src/Main/Base/Project/Src/Project/MSBuildProject.cs b/src/Main/Base/Project/Src/Project/MSBuildProject.cs index 5da0187849..b14eb99f7d 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildProject.cs @@ -117,6 +117,7 @@ namespace ICSharpCode.SharpDevelop.Project } } } + ExpandWildcards(); string userSettingsFileName = projectFileName + ".user"; if (File.Exists(userSettingsFileName)) { @@ -139,6 +140,26 @@ namespace ICSharpCode.SharpDevelop.Project } } + void ExpandWildcards() + { + for (int i = 0; i < items.Count; i++) { + ProjectItem item = items[i]; + if (item.Include.IndexOf('*') >= 0 && item is FileProjectItem) { + items.RemoveAt(i--); + try { + string path = Path.Combine(this.Directory, Path.GetDirectoryName(item.Include)); + foreach (string file in System.IO.Directory.GetFiles(path, Path.GetFileName(item.Include))) { + ProjectItem n = item.Clone(); + n.Include = FileUtility.GetRelativePath(this.Directory, file); + items.Insert(++i, n); + } + } catch (Exception ex) { + MessageService.ShowError(ex, "Error expanding wildcards in " + item.Include); + } + } + } + } + void LoadPropertyGroup(XmlReader reader, bool isUserFile) { string condition = reader.GetAttribute("Condition"); diff --git a/src/Main/Base/Project/Src/Project/WebReferenceUrl.cs b/src/Main/Base/Project/Src/Project/WebReferenceUrl.cs index 91ec5dafd6..1d9058aad6 100644 --- a/src/Main/Base/Project/Src/Project/WebReferenceUrl.cs +++ b/src/Main/Base/Project/Src/Project/WebReferenceUrl.cs @@ -116,5 +116,13 @@ namespace ICSharpCode.SharpDevelop.Project { UrlBehavior = "Static"; } + + public override ProjectItem Clone() + { + ProjectItem n = new WebReferenceUrl(this.Project); + n.Include = this.Include; + this.CopyExtraPropertiesTo(n); + return n; + } } } From e90b0607e59876056fc11481e69386c90ed0f0ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Fri, 28 Apr 2006 18:23:41 +0000 Subject: [PATCH 23/49] Remove surrounding '<' and '>' from compiler generated variable names; Check type of argument for property evaluation git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1361 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Debugger.Core/Project/Src/Variables/ObjectValue.cs | 2 +- .../Debugger.Core/Project/Src/Variables/Variable.cs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs index 71c8d0daa2..b9538f8c50 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs @@ -182,7 +182,7 @@ namespace Debugger ICorDebugValue[] GetArgsForEval(MethodProps method, ValueGetter getter) { - ObjectValue updatedVal = (ObjectValue)getter(); + ObjectValue updatedVal = getter() as ObjectValue; if (this.IsEquivalentValue(updatedVal)) { if (method.IsStatic) { return new ICorDebugValue[] {}; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs index 76a1428912..3e939682d9 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs @@ -120,6 +120,13 @@ namespace Debugger this.valueGetter = valueGetter; this.subVariables = new VariableCollection(debugger); this.subVariables.Updating += OnSubVariablesUpdating; + + if (name.StartsWith("<") && name.Contains(">") && name != "") { + string middle = name.TrimStart('<').Split('>')[0]; // Get text between '<' and '>' + if (middle != "") { + this.name = middle; + } + } } void OnSubVariablesUpdating(object sender, VariableCollectionEventArgs e) From 4ef8718f57830142c4af3672e3950f5fa904dcb8 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 28 Apr 2006 18:36:59 +0000 Subject: [PATCH 24/49] Fixed forum-7173: Code completion does not contain all types in scope git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1362 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../NRefactoryResolver/NRefactoryResolver.cs | 9 ++-- src/Main/Base/Test/NRefactoryResolverTests.cs | 52 +++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs index 49f1a97c42..ae2b33c086 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs @@ -1052,9 +1052,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver AddUsing(result, projectContent.DefaultImports, projectContent); if (callingClass != null) { - foreach (object member in projectContent.GetNamespaceContents(callingClass.Namespace)) { - if (!result.Contains(member)) - result.Add(member); + string[] namespaceParts = callingClass.Namespace.Split('.'); + for (int i = 1; i <= namespaceParts.Length; i++) { + foreach (object member in projectContent.GetNamespaceContents(string.Join(".", namespaceParts, 0, i))) { + if (!result.Contains(member)) + result.Add(member); + } } IClass currentClass = callingClass; do { diff --git a/src/Main/Base/Test/NRefactoryResolverTests.cs b/src/Main/Base/Test/NRefactoryResolverTests.cs index 9d8150c96f..cab0f5e9b3 100644 --- a/src/Main/Base/Test/NRefactoryResolverTests.cs +++ b/src/Main/Base/Test/NRefactoryResolverTests.cs @@ -606,6 +606,58 @@ class Activator { Assert.AreEqual("Testnamespace.Activator", result.ResolvedType.FullyQualifiedName); } + [Test] + public void ParentNamespaceTypeLookup() + { + // Classes in the current namespace are preferred over classes from + // imported namespaces + string program = @"using System; +namespace Root { + class Alpha {} +} +namespace Root.Child { + class Beta { + + } +} +"; + ResolveResult result = Resolve(program, "Alpha", 7); + Assert.AreEqual("Root.Alpha", result.ResolvedType.FullyQualifiedName); + } + + [Test] + public void ParentNamespaceCtrlSpace() + { + // Classes in the current namespace are preferred over classes from + // imported namespaces + string program = @"using System; +namespace Root { + class Alpha {} +} +namespace Root.Child { + class Beta { + + } +} +"; + AddCompilationUnit(Parse("a.cs", program), "a.cs"); + + NRefactoryResolver resolver = new NRefactoryResolver(ICSharpCode.NRefactory.Parser.SupportedLanguage.CSharp); + ArrayList m = resolver.CtrlSpace(7, 0, "a.cs", program, ExpressionContext.Default); + Assert.IsTrue(TypeExists(m, "Beta"), "Meta must exist"); + Assert.IsTrue(TypeExists(m, "Alpha"), "Alpha must exist"); + } + + bool TypeExists(ArrayList m, string name) + { + foreach (object o in m) { + IClass c = o as IClass; + if (c != null && c.Name == name) + return true; + } + return false; + } + [Test] public void ImportedSubnamespaceTestCSharp() { From 3aead82187b7f89f42c1abd67e813a804a5cc4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Fri, 28 Apr 2006 19:02:58 +0000 Subject: [PATCH 25/49] Do not expire functions during evaluation. (Fixes Forum-6794 Forum-6823 Forum-7029) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1363 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Debugger/Debugger.Core/Project/Src/Threads/Function.cs | 2 +- .../Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs index 59da4b3a09..258ac93ff5 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs @@ -42,7 +42,7 @@ namespace Debugger public string Name { get { - return methodProps.Name; + return methodProps.Name; // + "(" + chainIndex.ToString() + ", " + frameIndex.ToString() + ")"; } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs index 460a89cef1..efe77284a2 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs @@ -249,8 +249,11 @@ namespace Debugger return corFrameEnum.Next(); } + // NOTE: During evlulation some chains may be temporaly removed internal void CheckExpirationOfFunctions() { + if (debugger.Evaluating) return; + ICorDebugChainEnum corChainEnum = corThread.EnumerateChains(); uint maxChainIndex = corChainEnum.Count - 1; From 414ab810657c5dbf8ab638016251f562c89fb235 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 28 Apr 2006 19:15:55 +0000 Subject: [PATCH 26/49] Fixed SD2-508: Tooltips on declaration lines git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1364 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/CodeCompletion/BooResolver.cs | 3 +++ .../Misc/HtmlHelp2/Project/HtmlHelp2.csproj | 10 ++++---- .../NRefactoryResolver/NRefactoryResolver.cs | 25 +++++++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs index 1a6d51d429..08ef055673 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs @@ -197,6 +197,9 @@ namespace Grunwald.BooBinding.CodeCompletion return new NamespaceResolveResult(callingClass, callingMember, ""); } + ResolveResult rr = NRResolver.GetResultFromDeclarationLine(callingClass, callingMember as IMethodOrProperty, caretLine, caretColumn, expressionResult.Expression); + if (rr != null) return rr; + AST.Expression expr; try { expr = Boo.Lang.Parser.BooParser.ParseExpression("expression", expressionResult.Expression); diff --git a/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.csproj b/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.csproj index c3c9f35dc4..146b159c02 100644 --- a/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.csproj +++ b/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.csproj @@ -36,11 +36,6 @@ False - - ..\..\..\..\..\bin\ICSharpCode.TextEditor.dll - False - False - @@ -108,6 +103,11 @@ {E54A5AD2-418D-4A85-BA5E-CD803DE38715} HtmlHelp2JScriptGlobals + + {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} + ICSharpCode.TextEditor + False + \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs index ae2b33c086..9350da4ae8 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs @@ -121,6 +121,28 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return expression; } + public static ResolveResult GetResultFromDeclarationLine(IClass callingClass, IMethodOrProperty callingMember, int caretLine, int caretColumn, string expression) + { + if (callingClass == null) return null; + int pos = expression.IndexOf('('); + if (pos >= 0) { + expression = expression.Substring(0, pos); + } + expression = expression.Trim(); + if (!callingClass.BodyRegion.IsInside(caretLine, caretColumn) + && callingClass.ProjectContent.Language.NameComparer.Equals(expression, callingClass.Name)) + { + return new TypeResolveResult(callingClass, callingMember, callingClass); + } + if (callingMember != null + && !callingMember.BodyRegion.IsInside(caretLine, caretColumn) + && callingClass.ProjectContent.Language.NameComparer.Equals(expression, callingMember.Name)) + { + return new MemberResolveResult(callingClass, callingMember, callingMember); + } + return null; + } + public ResolveResult Resolve(ExpressionResult expressionResult, int caretLineNumber, int caretColumn, @@ -179,6 +201,9 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver RunLookupTableVisitor(fileContent); + ResolveResult rr = GetResultFromDeclarationLine(callingClass, callingMember as IMethodOrProperty, caretLine, caretColumn, expression); + if (rr != null) return rr; + return ResolveInternal(expr, expressionResult.Context); } From 7d76c1cb1b95a2d6b732a6efed10052d75a2da32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Fri, 28 Apr 2006 19:32:31 +0000 Subject: [PATCH 27/49] Breakpoint must be set within method body. (Forum-7107) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1365 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Threads/SourcecodeSegment.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/SourcecodeSegment.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/SourcecodeSegment.cs index 1d6aaf26cc..b27dc2ca2c 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/SourcecodeSegment.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/SourcecodeSegment.cs @@ -158,7 +158,7 @@ namespace Debugger function = null; ilOffset = 0; - Module module = null; + Module module = null; ISymUnmanagedReader symReader = null; ISymUnmanagedDocument symDoc = null; @@ -206,7 +206,11 @@ namespace Debugger } ISymUnmanagedMethod symMethod; - symMethod = symReader.GetMethodFromDocumentPosition(symDoc, validLine, (uint)StartColumn); + try { + symMethod = symReader.GetMethodFromDocumentPosition(symDoc, (uint)StartLine, (uint)StartColumn); + } catch { + return false; //Not found + } function = module.CorModule.GetFunctionFromToken(symMethod.Token); From 499fe3bdc23a12d81d31fd36326a621d96673324 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 28 Apr 2006 20:04:17 +0000 Subject: [PATCH 28/49] Fixed conversion of "global::" in CodeDOMOutputVisitor (part of SD2-576). git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1366 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Services/TypeResolutionService.cs | 5 +++++ .../Project/Src/ResourceEdit/ResourceList.cs | 7 +++---- .../Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs | 8 +++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs index a15504addc..c801c33b42 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs @@ -266,6 +266,11 @@ namespace ICSharpCode.FormsDesigner.Services if (IgnoreType(name)) { return null; } + #if DEBUG + if (!name.StartsWith("System.")) { + LoggingService.Debug("TypeResolutionService: Looking for " + name); + } + #endif try { Type type = Type.GetType(name, false, ignoreCase); diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs index 05d3df2320..3b2152d020 100644 --- a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs @@ -120,10 +120,10 @@ namespace ResourceEditor public void LoadFile(string filename) { - Stream s = File.OpenRead(filename); switch (Path.GetExtension(filename).ToLowerInvariant()) { case ".resx": - ResXResourceReader rx = new ResXResourceReader(s); + ResXResourceReader rx = new ResXResourceReader(filename); + rx.BasePath = Path.GetDirectoryName(filename); IDictionaryEnumerator n = rx.GetEnumerator(); while (n.MoveNext()) if (!resources.ContainsKey(n.Key.ToString())) @@ -135,7 +135,7 @@ namespace ResourceEditor //// new file will fail here - so we have to ignore exception(s) ResourceReader rr=null; try { - rr = new ResourceReader(s); + rr = new ResourceReader(filename); foreach (DictionaryEntry entry in rr) { if (!resources.ContainsKey(entry.Key.ToString())) resources.Add(entry.Key.ToString(), new ResourceItem(entry.Key.ToString(), entry.Value)); @@ -149,7 +149,6 @@ namespace ResourceEditor } break; } - s.Close(); InitializeListView(); } diff --git a/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs index c5b52a8798..d377b36a39 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs @@ -1,7 +1,7 @@ // // // -// +// // $Revision$ // @@ -896,6 +896,9 @@ namespace ICSharpCode.NRefactory.Parser IdentifierExpression identifier = fieldReferenceExpression.TargetObject as IdentifierExpression; if (identifier != null) return !IsField(identifier.Identifier) && !IsLocalVariable(identifier.Identifier); + TypeReferenceExpression tre = fieldReferenceExpression.TargetObject as TypeReferenceExpression; + if (tre != null) + return true; return false; } @@ -959,6 +962,9 @@ namespace ICSharpCode.NRefactory.Parser type = new StringBuilder(oldType); } return new CodeTypeReferenceExpression(type.ToString()); + } else if (fieldReferenceExpression.TargetObject is TypeReferenceExpression) { + type.Insert(0, ((TypeReferenceExpression)fieldReferenceExpression.TargetObject).TypeReference.SystemType); + return new CodeTypeReferenceExpression(type.ToString()); } else { return null; } From a8eba6021a18b36735b15fe087cc3bacd70e5f79 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 28 Apr 2006 21:09:28 +0000 Subject: [PATCH 29/49] Forms designer now tries to find VS designer assemblies if they are required - this fixes problems like SD2-617 (Editing Sql Connection ConnectionString property throws a FileNotFound exception) that only occur when VS is installed. Run application: If the specified working directory is invalid, display error message to user. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1367 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Services/TypeResolutionService.cs | 32 +++++++++++++++++++ .../Project/Src/Project/MSBuildProject.cs | 4 +++ 2 files changed, 36 insertions(+) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs index c801c33b42..7978b03fd1 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs @@ -17,6 +17,7 @@ using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.Core; using System.Diagnostics; +using Microsoft.Win32; namespace ICSharpCode.FormsDesigner.Services { @@ -339,6 +340,7 @@ namespace ICSharpCode.FormsDesigner.Services ICSharpCode.Core.LoggingService.Warn("TODO: Add Assembly reference : " + name); } + #region VSDesigner workarounds /// /// HACK - Ignore any requests for types from the Microsoft.VSDesigner /// assembly. There are smart tag problems if data adapter @@ -357,8 +359,38 @@ namespace ICSharpCode.FormsDesigner.Services return false; } + static string vsDesignerIdeDir; + + static void RegisterVSDesignerWorkaround() + { + if (vsDesignerIdeDir == null) { + vsDesignerIdeDir = ""; + RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\VisualStudio\8.0\Setup\VS"); + if (key != null) { + vsDesignerIdeDir = key.GetValue("VS7CommonDir") as string ?? ""; + if (vsDesignerIdeDir.Length > 0) { + vsDesignerIdeDir = Path.Combine(vsDesignerIdeDir, "IDE"); + AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs args) { + string shortName = args.Name; + if (shortName.IndexOf(',') >= 0) { + shortName = shortName.Substring(0, shortName.IndexOf(',')); + } + if (shortName.StartsWith("Microsoft.") + && File.Exists(Path.Combine(vsDesignerIdeDir, shortName + ".dll"))) + { + return Assembly.LoadFrom(Path.Combine(vsDesignerIdeDir, shortName + ".dll")); + } + return null; + }; + } + } + } + } + #endregion + public static void AddAssemblyResolver() { + RegisterVSDesignerWorkaround(); AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolveEventHandler; } diff --git a/src/Main/Base/Project/Src/Project/MSBuildProject.cs b/src/Main/Base/Project/Src/Project/MSBuildProject.cs index b14eb99f7d..8f5e6b9ff6 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildProject.cs @@ -353,6 +353,10 @@ namespace ICSharpCode.SharpDevelop.Project MessageService.ShowError(psi.FileName + " does not exist and cannot be started."); return; } + if (!System.IO.Directory.Exists(psi.WorkingDirectory)) { + MessageService.ShowError("Working directory " + psi.WorkingDirectory + " does not exist; the process cannot be started. You can specify the working directory in the project options."); + return; + } if (withDebugging) { DebuggerService.CurrentDebugger.Start(psi); From d4e9eff2468627e144f319dcda3ba27d66bb414b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 28 Apr 2006 21:14:03 +0000 Subject: [PATCH 30/49] Fixed SD2-642: Region inside class method not recognised git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1368 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../NRefactory/Project/Src/Lexer/CSharp/Lexer.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs b/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs index ba3f1381d8..5eb7883cdc 100644 --- a/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs +++ b/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs @@ -22,6 +22,14 @@ namespace ICSharpCode.NRefactory.Parser.CSharp { } + void ReadPreProcessingDirective() + { + Point start = new Point(Col - 1, Line); + string directive = ReadIdent('#'); + string argument = ReadToEOL(); + this.specialTracker.AddPreProcessingDirective(directive, argument.Trim(), start, new Point(start.X + directive.Length + argument.Length, start.Y)); + } + protected override Token Next() { int nextChar; @@ -47,10 +55,7 @@ namespace ICSharpCode.NRefactory.Parser.CSharp } break; case '#': - Point start = new Point(Col - 1, Line); - string directive = ReadIdent('#'); - string argument = ReadToEOL(); - this.specialTracker.AddPreProcessingDirective(directive, argument.Trim(), start, new Point(start.X + directive.Length + argument.Length, start.Y)); + ReadPreProcessingDirective(); continue; case '"': token = ReadString(); @@ -817,7 +822,7 @@ namespace ICSharpCode.NRefactory.Parser.CSharp } break; case '#': - SkipToEOL(); + ReadPreProcessingDirective(); break; case '"': ReadString(); From c8da081b4bd32cfcb99be673b58f1ca70dea8a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Fri, 28 Apr 2006 21:56:42 +0000 Subject: [PATCH 31/49] All debugger values are expired on state change git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1369 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Debugger.Core/Project/Src/Variables/Value.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs index d643f57dc8..69e44af273 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs @@ -19,7 +19,8 @@ namespace Debugger ICorDebugValue corValue; // ICorDebugHandleValue can be used to get corValue back after Continue() protected ICorDebugHandleValue corHandleValue; - object pauseSessionAtCreation; + PauseSession pauseSessionAtCreation; + DebugeeState debugeeStateAtCreation; public event EventHandler ValueChanged; @@ -31,6 +32,8 @@ namespace Debugger internal ICorDebugValue CorValue { get { + if (this.IsExpired) throw new DebuggerException("CorValue has expired"); + if (pauseSessionAtCreation == debugger.PauseSession) { return corValue; } else { @@ -47,6 +50,8 @@ namespace Debugger protected ICorDebugHandleValue SoftReference { get { + if (this.IsExpired) throw new DebuggerException("CorValue has expired"); + if (corHandleValue != null) return corHandleValue; ICorDebugHeapValue2 heapValue = this.CorValue.As(); @@ -66,7 +71,7 @@ namespace Debugger if (corHandleValue == null) { return pauseSessionAtCreation != debugger.PauseSession; } else { - return false; + return debugeeStateAtCreation != debugger.DebugeeState; } } } @@ -139,6 +144,7 @@ namespace Debugger this.corValue = DereferenceUnbox(corValue); } this.pauseSessionAtCreation = debugger.PauseSession; + this.debugeeStateAtCreation = debugger.DebugeeState; } public override string ToString() From 3897fc0a335430593048267c5cb74d13db7c8efc Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 29 Apr 2006 10:46:56 +0000 Subject: [PATCH 32/49] BooBinding: detect indexers in parsed code git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1370 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Boo/BooBinding/Project/Src/BooAmbience.cs | 8 ++++ .../Src/CodeCompletion/CompletionBinding.cs | 2 +- .../Src/CodeCompletion/ConvertVisitor.cs | 12 ++++++ .../Boo/BooBinding/Test/ResolverTests.cs | 41 ++++++++++++++----- .../Project/Src/CSharpAmbience.cs | 8 ++++ 5 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs index 24836c6af2..f23191f5c2 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs @@ -323,6 +323,14 @@ namespace Grunwald.BooBinding } if (property.IsIndexer) { + if (property.DeclaringType != null) { + if (UseFullyQualifiedMemberNames) { + builder.Append(property.DeclaringType.FullyQualifiedName); + } else { + builder.Append(property.DeclaringType.Name); + } + builder.Append('.'); + } builder.Append("self"); } else { if (IncludeHTMLMarkup) { diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/CompletionBinding.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/CompletionBinding.cs index b7a994fc30..dda759faba 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/CompletionBinding.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/CompletionBinding.cs @@ -52,7 +52,7 @@ namespace Grunwald.BooBinding.CodeCompletion public override bool HandleKeyword(SharpDevelopTextAreaControl editor, string word) { - switch (word.ToLower(CultureInfo.InvariantCulture)) { + switch (word.ToLowerInvariant()) { case "import": editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(ExpressionContext.Importable), ' '); return true; diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs index 08d411a5fa..d0e5c8c642 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs @@ -401,6 +401,18 @@ namespace Grunwald.BooBinding.CodeCompletion private void LeaveTypeDefinition(AST.TypeDefinition node) { DefaultClass c = _currentClass.Pop(); + foreach (AST.Attribute att in node.Attributes) { + if (att.Name == "System.Reflection.DefaultMemberAttribute" && att.Arguments.Count == 1) { + AST.StringLiteralExpression sle = att.Arguments[0] as AST.StringLiteralExpression; + if (sle != null) { + foreach (DefaultProperty p in c.Properties) { + if (p.Name == sle.Value) { + p.IsIndexer = true; + } + } + } + } + } //LoggingService.Debug("Leave "+node.GetType().Name+" "+node.FullName+" (Class = "+c.FullyQualifiedName+")"); } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs index e0894a6252..2803ab4dbd 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -26,10 +26,7 @@ namespace Grunwald.BooBinding.Tests T Resolve(string code, string marker) where T : ResolveResult { - ResolveResult rr = Resolve(prog, new ExpressionResult(code), marker); - Assert.IsNotNull(rr, "Resolve must not return null"); - Assert.IsInstanceOfType(typeof(T), rr, "Resolve must return instance of type " + typeof(T).Name); - return (T)rr; + return Resolve(normalProg, code, marker); } T ResolveReg(string code) where T : ResolveResult @@ -39,7 +36,12 @@ namespace Grunwald.BooBinding.Tests T ResolveReg(string code, string marker) where T : ResolveResult { - ResolveResult rr = Resolve(regressionProg, new ExpressionResult(code), marker); + return Resolve(regressionProg, code, marker); + } + + T Resolve(string prog, string code, string marker) where T : ResolveResult + { + ResolveResult rr = Resolve(prog, new ExpressionResult(code), marker); Assert.IsNotNull(rr, "Resolve must not return null"); Assert.IsInstanceOfType(typeof(T), rr, "Resolve must return instance of type " + typeof(T).Name); return (T)rr; @@ -92,7 +94,7 @@ namespace Grunwald.BooBinding.Tests #endregion #region Basic tests - const string prog = + const string normalProg = "import System\n" + "def MyMethod(arg as string):\n" + "\tlocalVar = arg\n" + @@ -145,7 +147,7 @@ namespace Grunwald.BooBinding.Tests LocalResolveResult rr = Resolve("e", "/*inClosure*/"); Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName); - Assert.IsNull(Resolve(prog, new ExpressionResult("e"), "/*1*/")); + Assert.IsNull(Resolve(normalProg, new ExpressionResult("e"), "/*1*/")); } [Test] @@ -207,10 +209,8 @@ namespace Grunwald.BooBinding.Tests "\tdef Test():\n" + "\t\t/*mark*/\n" + "\t\tpass\n"; - ResolveResult rr = Resolve(prog, new ExpressionResult("Test()"), "/*mark*/"); - Assert.IsNotNull(rr); - Assert.IsInstanceOfType(typeof(MemberResolveResult), rr); - Assert.AreEqual("OtherClass.Test", (rr as MemberResolveResult).ResolvedMember.FullyQualifiedName); + MemberResolveResult rr = Resolve(prog, "Test()", "/*mark*/"); + Assert.AreEqual("OtherClass.Test", rr.ResolvedMember.FullyQualifiedName); } #endregion @@ -243,6 +243,25 @@ namespace Grunwald.BooBinding.Tests Assert.AreEqual("System.Object", rr.ResolvedType.FullyQualifiedName); Assert.IsNull(Resolve(regressionProg, new ExpressionResult("boo640a"), "/*1*/")); } + + [Test] + public void IndexerRecognition() + { + string prog = + "class Foo:\n" + + "\tself[index as int]:\n" + + "\t\tget:\n" + + "\t\t\treturn true\n" + + "def example():\n" + + "\tfoo = Foo()\n" + + "\tmybool = foo[1] /*mark*/\n" + + "\tprint mybool\n"; + MemberResolveResult rr = Resolve(prog, "foo[1]", "/*mark*/"); + Assert.IsTrue(((IProperty)rr.ResolvedMember).IsIndexer); + Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName); + LocalResolveResult rr2 = Resolve(prog, "mybool", "/*mark*/"); + Assert.AreEqual("System.Boolean", rr2.ResolvedType.FullyQualifiedName); + } #endregion #region CtrlSpace diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs index 01f78e2b27..8de64ec886 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs @@ -303,6 +303,14 @@ namespace ICSharpCode.Core } if (property.IsIndexer) { + if (property.DeclaringType != null) { + if (UseFullyQualifiedMemberNames) { + builder.Append(property.DeclaringType.FullyQualifiedName); + } else { + builder.Append(property.DeclaringType.Name); + } + builder.Append('.'); + } builder.Append("this"); } else { if (IncludeHTMLMarkup) { From 332dd9f511bb4ba3de504b2504b10a8d350a17d7 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 29 Apr 2006 15:55:39 +0000 Subject: [PATCH 33/49] Fixed SD2-671: Code generation doesn't substitute generic type git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1371 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Dom/Implementations/DefaultClass.cs | 20 +++- .../Dom/Implementations/DefaultReturnType.cs | 99 +++++++++++++------ src/Main/Base/Test/GenericResolverTests.cs | 31 ++++++ .../StartUp/Project/Dialogs/ExceptionBox.cs | 6 +- src/SharpDevelop.Tests.sln | 23 ++++- 5 files changed, 141 insertions(+), 38 deletions(-) diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs index af1eebbb05..38b9d245fd 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs @@ -336,14 +336,24 @@ namespace ICSharpCode.SharpDevelop.Dom return BaseTypes[index]; } + IReturnType cachedBaseType; + public IReturnType BaseType { get { - foreach (IReturnType baseType in this.BaseTypes) { - IClass baseClass = baseType.GetUnderlyingClass(); - if (baseClass != null && baseClass.ClassType == this.ClassType) - return baseType; + if (cachedBaseType == null) { + foreach (IReturnType baseType in this.BaseTypes) { + IClass baseClass = baseType.GetUnderlyingClass(); + if (baseClass != null && baseClass.ClassType == this.ClassType) { + cachedBaseType = baseType; + break; + } + } + } + if (cachedBaseType == null) { + return GetBaseTypeByClassType(); + } else { + return cachedBaseType; } - return GetBaseTypeByClassType(); } } diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs index f78dfd5fd9..ea33b9d93b 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs @@ -43,23 +43,40 @@ namespace ICSharpCode.SharpDevelop.Dom return c; } + bool getMembersBusy; + public override List GetMethods() { + if (getMembersBusy) return new List(); + getMembersBusy = true; List l = new List(); - foreach (IClass bc in c.ClassInheritanceTree) { - if (bc.ClassType == ClassType.Interface && c.ClassType != ClassType.Interface) - continue; // ignore explicit interface implementations - - foreach (IMethod m in bc.Methods) { - // do not add base class constructors - if (m.IsConstructor && c != bc) + l.AddRange(c.Methods); + if (c.ClassType == ClassType.Interface) { + if (c.BaseTypes.Count == 0) { + AddMethodsFromBaseType(l, ReflectionReturnType.Object); + } else { + foreach (IReturnType baseType in c.BaseTypes) { + AddMethodsFromBaseType(l, baseType); + } + } + } else { + AddMethodsFromBaseType(l, c.BaseType); + } + getMembersBusy = false; + return l; + } + + void AddMethodsFromBaseType(List l, IReturnType baseType) + { + if (baseType != null) { + foreach (IMethod m in baseType.GetMethods()) { + if (m.IsConstructor) continue; - // do not add methods that were overridden bool ok = true; if (m.IsOverridable) { StringComparer comparer = m.DeclaringType.ProjectContent.Language.NameComparer; - foreach (IMethod oldMethod in l) { + foreach (IMethod oldMethod in c.Methods) { if (comparer.Equals(oldMethod.Name, m.Name)) { if (m.IsStatic == oldMethod.IsStatic) { if (DiffUtility.Compare(oldMethod.Parameters, m.Parameters) == 0) { @@ -74,22 +91,33 @@ namespace ICSharpCode.SharpDevelop.Dom l.Add(m); } } - return l; } public override List GetProperties() { + if (getMembersBusy) return new List(); + getMembersBusy = true; List l = new List(); - foreach (IClass bc in c.ClassInheritanceTree) { - if (bc.ClassType == ClassType.Interface && c.ClassType != ClassType.Interface) - continue; // ignore explicit interface implementations - - foreach (IProperty p in bc.Properties) { - // do not add methods that were overridden + l.AddRange(c.Properties); + if (c.ClassType == ClassType.Interface) { + foreach (IReturnType baseType in c.BaseTypes) { + AddPropertiesFromBaseType(l, baseType); + } + } else { + AddPropertiesFromBaseType(l, c.BaseType); + } + getMembersBusy = false; + return l; + } + + void AddPropertiesFromBaseType(List l, IReturnType baseType) + { + if (baseType != null) { + foreach (IProperty p in baseType.GetProperties()) { bool ok = true; if (p.IsOverridable) { StringComparer comparer = p.DeclaringType.ProjectContent.Language.NameComparer; - foreach (IProperty oldProperty in l) { + foreach (IProperty oldProperty in c.Properties) { if (comparer.Equals(oldProperty.Name, p.Name)) { if (p.IsStatic == oldProperty.IsStatic) { if (DiffUtility.Compare(oldProperty.Parameters, p.Parameters) == 0) { @@ -104,28 +132,43 @@ namespace ICSharpCode.SharpDevelop.Dom l.Add(p); } } - return l; } public override List GetFields() { - List l = new List(); - foreach (IClass bc in c.ClassInheritanceTree) { - if (bc.ClassType == ClassType.Interface && c.ClassType != ClassType.Interface) - continue; // ignore explicit interface implementations - l.AddRange(bc.Fields); + if (getMembersBusy) return new List(); + getMembersBusy = true; + List l; + if (c.ClassType == ClassType.Interface) { + l = new List(); + foreach (IReturnType baseType in c.BaseTypes) { + l.AddRange(baseType.GetFields()); + } + } else { + IReturnType baseType = c.BaseType; + l = baseType != null ? c.BaseType.GetFields() : new List(); } + l.AddRange(c.Fields); + getMembersBusy = false; return l; } public override List GetEvents() { - List l = new List(); - foreach (IClass bc in c.ClassInheritanceTree) { - if (bc.ClassType == ClassType.Interface && c.ClassType != ClassType.Interface) - continue; // ignore explicit interface implementations - l.AddRange(bc.Events); + if (getMembersBusy) return new List(); + getMembersBusy = true; + List l; + if (c.ClassType == ClassType.Interface) { + l = new List(); + foreach (IReturnType baseType in c.BaseTypes) { + l.AddRange(baseType.GetEvents()); + } + } else { + IReturnType baseType = c.BaseType; + l = baseType != null ? c.BaseType.GetEvents() : new List(); } + l.AddRange(c.Events); + getMembersBusy = false; return l; } diff --git a/src/Main/Base/Test/GenericResolverTests.cs b/src/Main/Base/Test/GenericResolverTests.cs index 0fbd070815..06ea629f7f 100644 --- a/src/Main/Base/Test/GenericResolverTests.cs +++ b/src/Main/Base/Test/GenericResolverTests.cs @@ -156,6 +156,37 @@ class TestClass { LocalResolveResult lr = Resolve(program, "a", 5) as LocalResolveResult; Assert.AreEqual("System.Collections.Generic.List{System.String}", lr.ResolvedType.DotNetName, "a"); } + + [Test] + public void InheritFromGenericClass() + { + string program = @"using System; +class BaseClass { + public T value; +} +class DerivedClass : BaseClass { + +}"; + MemberResolveResult rr = Resolve(program, "value", 6) as MemberResolveResult; + Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName); + } + + [Test] + public void CrossTypeParametersInheritance() + { + string program = @"using System; +class BaseClass { + public A a; + public B b; +} +class DerivedClass : BaseClass { + +}"; + MemberResolveResult rr = Resolve(program, "a", 7) as MemberResolveResult; + Assert.AreEqual("B", rr.ResolvedType.Name); + rr = Resolve(program, "b", 7) as MemberResolveResult; + Assert.AreEqual("A", rr.ResolvedType.Name); + } #endregion #region CodeCompletion inside generic classes diff --git a/src/Main/StartUp/Project/Dialogs/ExceptionBox.cs b/src/Main/StartUp/Project/Dialogs/ExceptionBox.cs index 3a6afe41db..4d505182d2 100644 --- a/src/Main/StartUp/Project/Dialogs/ExceptionBox.cs +++ b/src/Main/StartUp/Project/Dialogs/ExceptionBox.cs @@ -110,10 +110,8 @@ namespace ICSharpCode.SharpDevelop { CopyInfoToClipboard(); - StartUrl("http://community.sharpdevelop.net/forums/23/ShowForum.aspx"); - - //Version v = Assembly.GetEntryAssembly().GetName().Version; - //StartUrl("http://www.icsharpcode.net/OpenSource/SD/BugReporting.aspx?version=" + v.Major + "." + v.Minor + "." + v.Revision + "." + v.Build); + Version v = Assembly.GetEntryAssembly().GetName().Version; + StartUrl("http://www.icsharpcode.net/OpenSource/SD/BugReporting.aspx?version=" + v.Major + "." + v.Minor + "." + v.Revision + "." + v.Build); /* string text = "This version of SharpDevelop is an internal build, " + diff --git a/src/SharpDevelop.Tests.sln b/src/SharpDevelop.Tests.sln index 714bb3111f..6df16f1a5f 100644 --- a/src/SharpDevelop.Tests.sln +++ b/src/SharpDevelop.Tests.sln @@ -1,9 +1,15 @@ Microsoft Visual Studio Solution File, Format Version 9.00 -# SharpDevelop 2.0.0.1084 +# SharpDevelop 2.1.0.1340 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{14A277EE-7DF1-4529-B639-7D1EF334C1C5}" ProjectSection(SolutionItems) = postProject EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "AddIns\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding.Tests", "AddIns\BackendBindings\Boo\BooBinding\Test\BooBinding.Tests.csproj", "{6FA16499-896F-4C02-BB43-1AF5C6C7C713}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "AddIns\BackendBindings\Boo\BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NAntAddIn.Tests", "AddIns\Misc\NAntAddIn\Test\NAntAddIn.Tests.csproj", "{13AB8351-39E5-4F9D-A59C-B30D60CF6B8C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NAntAddIn", "AddIns\Misc\NAntAddIn\Project\NAntAddIn.csproj", "{1DB3CAD2-38E8-4C5E-8E1B-0E37B1A5C006}" @@ -206,6 +212,18 @@ Global {1F261725-6318-4434-A1B1-6C70CE4CD324}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1F261725-6318-4434-A1B1-6C70CE4CD324}.Release|Any CPU.Build.0 = Release|Any CPU {1F261725-6318-4434-A1B1-6C70CE4CD324}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4AC2D5F1-F671-480C-A075-6BF62B3721B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4AC2D5F1-F671-480C-A075-6BF62B3721B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4AC2D5F1-F671-480C-A075-6BF62B3721B2}.Release|Any CPU.Build.0 = Release|Any CPU + {4AC2D5F1-F671-480C-A075-6BF62B3721B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Release|Any CPU.Build.0 = Release|Any CPU + {6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}.Release|Any CPU.Build.0 = Release|Any CPU + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -225,6 +243,9 @@ Global {1F261725-6318-4434-A1B1-6C70CE4CD324} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} {1DB3CAD2-38E8-4C5E-8E1B-0E37B1A5C006} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} {13AB8351-39E5-4F9D-A59C-B30D60CF6B8C} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} + {4AC2D5F1-F671-480C-A075-6BF62B3721B2} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} + {6FA16499-896F-4C02-BB43-1AF5C6C7C713} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} {B08385CD-F0CC-488C-B4F4-EEB34B6D2688} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D} {1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D} {EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D} From 6255ccddd22a8960c9a3ebf2665a3e555a11774b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 29 Apr 2006 16:07:15 +0000 Subject: [PATCH 34/49] Fixed SD2-696: Code completion list background is transparent when containing one item git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1372 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Gui/CompletionWindow/AbstractCompletionWindow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/AbstractCompletionWindow.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/AbstractCompletionWindow.cs index b20b72ec3e..94ae8d670b 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/AbstractCompletionWindow.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/AbstractCompletionWindow.cs @@ -41,6 +41,7 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow StartPosition = FormStartPosition.Manual; FormBorderStyle = FormBorderStyle.None; ShowInTaskbar = false; + MinimumSize = new Size(1, 1); Size = new Size(1, 1); } From ed672103f2a4b646bed7eab7dcbf72ab07d96594 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 29 Apr 2006 16:31:04 +0000 Subject: [PATCH 35/49] Fixed SD2-716: Forms Designer loads "hidden references" twice git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1373 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Services/TypeResolutionService.cs | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs index 7978b03fd1..fada2cbcce 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/TypeResolutionService.cs @@ -131,6 +131,11 @@ namespace ICSharpCode.FormsDesigner.Services } } + static string GetHash(string fileName) + { + return Path.GetFileName(fileName).ToLowerInvariant() + File.GetLastWriteTimeUtc(fileName).Ticks.ToString(); + } + /// /// Loads the file in none-locking mode. Returns null on failure. /// @@ -138,7 +143,16 @@ namespace ICSharpCode.FormsDesigner.Services { if (!File.Exists(fileName)) return null; - string hash = Path.GetFileName(fileName) + File.GetLastWriteTimeUtc(fileName).Ticks.ToString(); + + // FIX for SD2-716, remove when designer gets its own AppDomain + foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { + if (string.Equals(asm.Location, fileName, StringComparison.InvariantCultureIgnoreCase)) { + RegisterAssembly(asm); + return asm; + } + } + + string hash = GetHash(fileName); lock (assemblyDict) { Assembly asm; if (assemblyDict.TryGetValue(hash, out asm)) @@ -214,6 +228,20 @@ namespace ICSharpCode.FormsDesigner.Services } } + public static void RegisterAssembly(Assembly asm) + { + string file = asm.Location; + if (file.Length > 0) { + lock (assemblyDict) { + assemblyDict[GetHash(file)] = asm; + } + } + lock (designerAssemblies) { + if (!designerAssemblies.Contains(asm)) + designerAssemblies.Insert(0, asm); + } + } + public Assembly GetAssembly(AssemblyName name) { return LoadAssembly(name, false); @@ -228,10 +256,7 @@ namespace ICSharpCode.FormsDesigner.Services { try { Assembly asm = Assembly.Load(name); - lock (designerAssemblies) { - if (!designerAssemblies.Contains(asm)) - designerAssemblies.Insert(0, asm); - } + RegisterAssembly(asm); return asm; } catch (System.IO.FileLoadException) { if (throwOnError) From 3a82fa2f79cef6d490ce65f51c21a961de48c847 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 29 Apr 2006 17:19:31 +0000 Subject: [PATCH 36/49] Fixed SD2-726: Xml comment autogeneration on methods with attributes git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1374 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../CSharpFormattingStrategy.cs | 104 ++++++++---------- .../VBNetFormattingStrategy.cs | 102 ++++++++--------- 2 files changed, 96 insertions(+), 110 deletions(-) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs index 704865e096..c2ecc02e16 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs @@ -231,71 +231,63 @@ namespace CSharpBinding.FormattingStrategy return false; } - - - bool IsBeforeRegion(TextArea textArea, DomRegion region, int lineNr) - { - if (region.IsEmpty) { - return false; - } - return region.BeginLine - 2 <= lineNr && lineNr <= region.BeginLine; - } - - object GetClassMember(TextArea textArea, int lineNr, IClass c) - { - if (IsBeforeRegion(textArea, c.Region, lineNr)) { - return c; - } - - foreach (IClass inner in c.InnerClasses) { - object o = GetClassMember(textArea, lineNr, inner); - if (o != null) { - return o; - } - } - - foreach (IField f in c.Fields) { - if (IsBeforeRegion(textArea, f.Region, lineNr)) { - return f; - } - } - foreach (IProperty p in c.Properties) { - if (IsBeforeRegion(textArea, p.Region, lineNr)) { - return p; - } - } - foreach (IEvent e in c.Events) { - if (IsBeforeRegion(textArea, e.Region, lineNr)) { - return e; - } - } - foreach (IMethod m in c.Methods) { - if (IsBeforeRegion(textArea, m.Region, lineNr)) { - return m; - } - } - return null; - } - - object GetMember(TextArea textArea, int lineNr) + /// + /// Gets the next member after the specified caret position. + /// + object GetMemberAfter(TextArea textArea, int caretLine) { string fileName = textArea.MotherTextEditorControl.FileName; + object nextElement = null; if (fileName != null && fileName.Length > 0 ) { - string fullPath = Path.GetFullPath(fileName); - ParseInformation parseInfo = ParserService.GetParseInformation(fullPath); + ParseInformation parseInfo = ParserService.ParseFile(fileName, textArea.Document.TextContent); if (parseInfo != null) { - ICompilationUnit currentCompilationUnit = (ICompilationUnit)parseInfo.BestCompilationUnit; + ICompilationUnit currentCompilationUnit = parseInfo.BestCompilationUnit; if (currentCompilationUnit != null) { - foreach (IClass c in currentCompilationUnit.Classes) { - object o = GetClassMember(textArea, lineNr, c); - if (o != null) { - return o; + IClass currentClass = currentCompilationUnit.GetInnermostClass(caretLine, 0); + int nextElementLine = int.MaxValue; + if (currentClass == null) { + foreach (IClass c in currentCompilationUnit.Classes) { + if (c.Region.BeginLine < nextElementLine && c.Region.BeginLine > caretLine) { + nextElementLine = c.Region.BeginLine; + nextElement = c; + } + } + } else { + foreach (IClass c in currentClass.InnerClasses) { + if (c.Region.BeginLine < nextElementLine && c.Region.BeginLine > caretLine) { + nextElementLine = c.Region.BeginLine; + nextElement = c; + } + } + foreach (IMember m in currentClass.Methods) { + if (m.Region.BeginLine < nextElementLine && m.Region.BeginLine > caretLine) { + nextElementLine = m.Region.BeginLine; + nextElement = m; + } + } + foreach (IMember m in currentClass.Properties) { + if (m.Region.BeginLine < nextElementLine && m.Region.BeginLine > caretLine) { + nextElementLine = m.Region.BeginLine; + nextElement = m; + } + } + foreach (IMember m in currentClass.Fields) { + if (m.Region.BeginLine < nextElementLine && m.Region.BeginLine > caretLine) { + nextElementLine = m.Region.BeginLine; + nextElement = m; + } + } + foreach (IMember m in currentClass.Events) { + if (m.Region.BeginLine < nextElementLine && m.Region.BeginLine > caretLine) { + nextElementLine = m.Region.BeginLine; + nextElement = m; + } } } } } } - return null; + return nextElement; } #endregion @@ -327,7 +319,7 @@ namespace CSharpBinding.FormattingStrategy string lineAboveText = lineAbove == null ? "" : textArea.Document.GetText(lineAbove); if (curLineText != null && curLineText.EndsWith("///") && (lineAboveText == null || !lineAboveText.Trim().StartsWith("///"))) { string indentation = base.GetIndentation(textArea, lineNr); - object member = GetMember(textArea, lineNr); + object member = GetMemberAfter(textArea, lineNr); if (member != null) { StringBuilder sb = new StringBuilder(); sb.Append(" \n"); diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs index 0b62113a8d..7e91d273ca 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs @@ -269,7 +269,7 @@ namespace VBNetBinding.FormattingStrategy if (curLineText != null && curLineText.EndsWith("'''") && (lineAboveText == null || !lineAboveText.Trim().StartsWith("'''"))) { string indentation = base.GetIndentation(textArea, lineNr); - object member = GetMember(textArea, lineNr); + object member = GetMemberAfter(textArea, lineNr); if (member != null) { StringBuilder sb = new StringBuilder(); sb.Append(" \n"); @@ -446,69 +446,63 @@ namespace VBNetBinding.FormattingStrategy return false; } - object GetMember(TextArea textArea, int lineNr) + /// + /// Gets the next member after the specified caret position. + /// + object GetMemberAfter(TextArea textArea, int caretLine) { string fileName = textArea.MotherTextEditorControl.FileName; + object nextElement = null; if (fileName != null && fileName.Length > 0 ) { - string fullPath = Path.GetFullPath(fileName); - ParseInformation parseInfo = ParserService.GetParseInformation(fullPath); + ParseInformation parseInfo = ParserService.ParseFile(fileName, textArea.Document.TextContent); if (parseInfo != null) { - ICompilationUnit currentCompilationUnit = (ICompilationUnit)parseInfo.BestCompilationUnit; + ICompilationUnit currentCompilationUnit = parseInfo.BestCompilationUnit; if (currentCompilationUnit != null) { - foreach (IClass c in currentCompilationUnit.Classes) { - object o = GetClassMember(textArea, lineNr, c); - if (o != null) { - return o; + IClass currentClass = currentCompilationUnit.GetInnermostClass(caretLine, 0); + int nextElementLine = int.MaxValue; + if (currentClass == null) { + foreach (IClass c in currentCompilationUnit.Classes) { + if (c.Region.BeginLine < nextElementLine && c.Region.BeginLine > caretLine) { + nextElementLine = c.Region.BeginLine; + nextElement = c; + } + } + } else { + foreach (IClass c in currentClass.InnerClasses) { + if (c.Region.BeginLine < nextElementLine && c.Region.BeginLine > caretLine) { + nextElementLine = c.Region.BeginLine; + nextElement = c; + } + } + foreach (IMember m in currentClass.Methods) { + if (m.Region.BeginLine < nextElementLine && m.Region.BeginLine > caretLine) { + nextElementLine = m.Region.BeginLine; + nextElement = m; + } + } + foreach (IMember m in currentClass.Properties) { + if (m.Region.BeginLine < nextElementLine && m.Region.BeginLine > caretLine) { + nextElementLine = m.Region.BeginLine; + nextElement = m; + } + } + foreach (IMember m in currentClass.Fields) { + if (m.Region.BeginLine < nextElementLine && m.Region.BeginLine > caretLine) { + nextElementLine = m.Region.BeginLine; + nextElement = m; + } + } + foreach (IMember m in currentClass.Events) { + if (m.Region.BeginLine < nextElementLine && m.Region.BeginLine > caretLine) { + nextElementLine = m.Region.BeginLine; + nextElement = m; + } } } } } } - return null; - } - - object GetClassMember(TextArea textArea, int lineNr, IClass c) - { - if (IsBeforeRegion(textArea, c.Region, lineNr)) { - return c; - } - - foreach (IClass inner in c.InnerClasses) { - object o = GetClassMember(textArea, lineNr, inner); - if (o != null) { - return o; - } - } - - foreach (IField f in c.Fields) { - if (IsBeforeRegion(textArea, f.Region, lineNr)) { - return f; - } - } - foreach (IProperty p in c.Properties) { - if (IsBeforeRegion(textArea, p.Region, lineNr)) { - return p; - } - } - foreach (IEvent e in c.Events) { - if (IsBeforeRegion(textArea, e.Region, lineNr)) { - return e; - } - } - foreach (IMethod m in c.Methods) { - if (IsBeforeRegion(textArea, m.Region, lineNr)) { - return m; - } - } - return null; - } - - bool IsBeforeRegion(TextArea textArea, DomRegion region, int lineNr) - { - if (region.IsEmpty) { - return false; - } - return region.BeginLine - 2 <= lineNr && lineNr <= region.BeginLine; + return nextElement; } bool IsInString(string start) From de3141c7850bb8e796a4f686469c5a6193e396a1 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 30 Apr 2006 13:29:56 +0000 Subject: [PATCH 37/49] Improved code-completion for duck-typing. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1375 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/CodeCompletion/BooResolver.cs | 43 ++++++++++++++++++- .../Src/CodeCompletion/ConvertVisitor.cs | 12 ++++-- .../Src/CodeCompletion/InferredReturnType.cs | 5 +++ .../Project/Resources/Boo.xshd | 1 + .../ReflectionLayer/ReflectionReturnType.cs | 8 ++-- .../RefactoringService/RefactoringService.cs | 33 ++++++++------ 6 files changed, 80 insertions(+), 22 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs index 08ef055673..d38209faa0 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs @@ -347,12 +347,51 @@ namespace Grunwald.BooBinding.CodeCompletion void AddImportedNamespaceContents(ArrayList list) { IClass c; - foreach (KeyValuePair pair in BooAmbience.TypeConversionTable) { - c = GetPrimitiveClass(pc, pair.Key, pair.Value); + foreach (KeyValuePair pair in BooAmbience.ReverseTypeConversionTable) { + c = GetPrimitiveClass(pc, pair.Value, pair.Key); if (c != null) list.Add(c); } + list.Add(new DuckClass(cu)); NRResolver.AddImportedNamespaceContents(list, cu, callingClass); } + + internal class DuckClass : DefaultClass + { + public DuckClass(ICompilationUnit cu) : base(cu, "duck") + { + Documentation = "Use late-binding to access members of this type.
\n'If it walks like a duck and quacks like a duck, it must be a duck.'"; + Modifiers = ModifierEnum.Public; + } + + protected override IReturnType CreateDefaultReturnType() + { + return new DuckReturnType(this); + } + } + + internal class DuckReturnType : AbstractReturnType + { + IClass c; + public DuckReturnType(IClass c) { + this.c = c; + FullyQualifiedName = c.FullyQualifiedName; + } + public override IClass GetUnderlyingClass() { + return c; + } + public override List GetMethods() { + return new List(); + } + public override List GetProperties() { + return new List(); + } + public override List GetFields() { + return new List(); + } + public override List GetEvents() { + return new List(); + } + } #endregion } } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs index d0e5c8c642..ad3a306a49 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs @@ -217,9 +217,13 @@ namespace Grunwald.BooBinding.CodeCompletion IMethodOrProperty callingMember, int caretLine, int caretColumn, IProjectContent projectContent) { + System.Diagnostics.Debug.Assert(projectContent != null); if (reference == null) { - LoggingService.Warn("inferred return type!"); - return ReflectionReturnType.Object; + BooProject project = projectContent.Project as BooProject; + if (project != null && project.Ducky) + return new BooResolver.DuckClass(new DefaultCompilationUnit(projectContent)).DefaultReturnType; + else + return ReflectionReturnType.Object; } if (reference is AST.ArrayTypeReference) { AST.ArrayTypeReference arr = (AST.ArrayTypeReference)reference; @@ -230,7 +234,9 @@ namespace Grunwald.BooBinding.CodeCompletion string name = ((AST.SimpleTypeReference)reference).Name; IReturnType rt; int typeParameterCount = (reference is AST.GenericTypeReference) ? ((AST.GenericTypeReference)reference).GenericArguments.Count : 0; - if (BooAmbience.ReverseTypeConversionTable.ContainsKey(name)) + if (name == "duck") + rt = new BooResolver.DuckClass(new DefaultCompilationUnit(projectContent)).DefaultReturnType; + else if (BooAmbience.ReverseTypeConversionTable.ContainsKey(name)) rt = new GetClassReturnType(projectContent, BooAmbience.ReverseTypeConversionTable[name], typeParameterCount); else rt = new SearchClassReturnType(projectContent, callingClass, caretLine, caretColumn, diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs index c262c98871..a7a70a2298 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs @@ -102,6 +102,11 @@ namespace Grunwald.BooBinding.CodeCompletion result = new ConstructedReturnType(enumerable.DefaultReturnType, new IReturnType[] { new InferredReturnType(node.Expression, context) }); } + public override void OnCallableBlockExpression(CallableBlockExpression node) + { + // ignore return statements in callable blocks + } + public override bool Visit(Node node) { if (result != null && !(result is NullReturnType)) diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Resources/Boo.xshd b/src/Libraries/ICSharpCode.TextEditor/Project/Resources/Boo.xshd index 2e093d2cf0..ee793c29ba 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Resources/Boo.xshd +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Resources/Boo.xshd @@ -173,6 +173,7 @@ + diff --git a/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionReturnType.cs b/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionReturnType.cs index 1d366bb7c5..652c97c91e 100644 --- a/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionReturnType.cs +++ b/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionReturnType.cs @@ -116,16 +116,16 @@ namespace ICSharpCode.SharpDevelop.Dom return ProjectContentRegistry.Mscorlib.GetClass(FullyQualifiedName); } public override List GetMethods() { - return new List(1); + return new List(); } public override List GetProperties() { - return new List(1); + return new List(); } public override List GetFields() { - return new List(1); + return new List(); } public override List GetEvents() { - return new List(1); + return new List(); } } diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs index 1d452610e0..9392dc5e26 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs @@ -37,19 +37,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring // can derive from the class continue; } - foreach (IClass c in pc.Classes) { - int count = c.BaseTypes.Count; - for (int i = 0; i < count; i++) { - string baseTypeName = c.BaseTypes[i].Name; - if (pc.Language.NameComparer.Equals(baseTypeName, baseClassName) || - pc.Language.NameComparer.Equals(baseTypeName, baseClassFullName)) { - IReturnType possibleBaseClass = c.GetBaseType(i); - if (possibleBaseClass.FullyQualifiedName == baseClass.FullyQualifiedName) { - list.Add(c); - } - } - } - } + AddDerivedClasses(pc, baseClass, baseClassName, baseClassFullName, pc.Classes, list); } if (!directDerivationOnly) { List additional = new List(); @@ -63,6 +51,25 @@ namespace ICSharpCode.SharpDevelop.Refactoring } return list; } + + static void AddDerivedClasses(IProjectContent pc, IClass baseClass, string baseClassName, string baseClassFullName, + IEnumerable classList, IList resultList) + { + foreach (IClass c in classList) { + AddDerivedClasses(pc, baseClass, baseClassName, baseClassFullName, c.InnerClasses, resultList); + int count = c.BaseTypes.Count; + for (int i = 0; i < count; i++) { + string baseTypeName = c.BaseTypes[i].Name; + if (pc.Language.NameComparer.Equals(baseTypeName, baseClassName) || + pc.Language.NameComparer.Equals(baseTypeName, baseClassFullName)) { + IReturnType possibleBaseClass = c.GetBaseType(i); + if (possibleBaseClass.FullyQualifiedName == baseClass.FullyQualifiedName) { + resultList.Add(c); + } + } + } + } + } #endregion #region FindReferences From c9b71ac07a4e0c94b0a273cd5800eaad5910f3b3 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 30 Apr 2006 14:37:23 +0000 Subject: [PATCH 38/49] Fixed forum-7221 git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1376 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Boo/BooBinding/Test/BooBinding.Tests.csproj | 5 ++++- src/Main/Base/Project/Src/Gui/Pads/FileScout.cs | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/BooBinding.Tests.csproj b/src/AddIns/BackendBindings/Boo/BooBinding/Test/BooBinding.Tests.csproj index c507a76e3f..69233d6392 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/BooBinding.Tests.csproj +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/BooBinding.Tests.csproj @@ -39,7 +39,10 @@ - + + ..\..\..\..\..\Tools\NUnit\nunit.framework.dll + False + diff --git a/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs b/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs index 3db7737677..593c9794cc 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/FileScout.cs @@ -277,8 +277,12 @@ namespace ICSharpCode.SharpDevelop.Gui FileInfo info = new FileInfo(e.FullPath); - fileItem.SubItems[1].Text = Math.Round((double)info.Length / 1024).ToString() + " KB"; - fileItem.SubItems[2].Text = info.LastWriteTime.ToString(); + try { + fileItem.SubItems[1].Text = Math.Round((double)info.Length / 1024).ToString() + " KB"; + fileItem.SubItems[2].Text = info.LastWriteTime.ToString(); + } catch (IOException) { + // ignore IO errors + } break; } } @@ -292,8 +296,12 @@ namespace ICSharpCode.SharpDevelop.Gui FileInfo info = new FileInfo(e.FullPath); ListViewItem fileItem = Items.Add(new FileListItem(e.FullPath)); - fileItem.SubItems.Add(Math.Round((double)info.Length / 1024).ToString() + " KB"); - fileItem.SubItems.Add(info.LastWriteTime.ToString()); + try { + fileItem.SubItems.Add(Math.Round((double)info.Length / 1024).ToString() + " KB"); + fileItem.SubItems.Add(info.LastWriteTime.ToString()); + } catch (IOException) { + // ignore IO errors + } }; WorkbenchSingleton.SafeThreadAsyncCall(method); } From e5bc45a6e20890092c2509fa1f56fb404c9ad87a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 30 Apr 2006 16:56:35 +0000 Subject: [PATCH 39/49] Fixed base addresses and used [DependencyAttribute] to prevent assemblies from being relocated. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1377 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- doc/AssemblyBaseAddresses.txt | 61 +++++++++++++++++++ .../Boo/BooBinding/Project/BooBinding.csproj | 2 +- .../Project/NRefactoryToBooConverter.csproj | 12 ++++ .../Project/CSharpBinding.csproj | 10 ++- .../ILAsmBinding/Project/ILAsmBinding.csproj | 11 +++- .../VBNetBinding/Project/VBNetBinding.csproj | 11 +++- .../Project/FormsDesigner.csproj | 2 +- .../Project/ResourceEditor.csproj | 11 +++- .../XmlEditor/Project/XmlEditor.csproj | 2 +- .../AddInManager/Project/AddInManager.csproj | 2 +- .../Misc/AddinScout/Project/AddinScout.csproj | 11 +++- .../CodeCoverage/Project/CodeCoverage.csproj | 2 +- .../Project/Debugger.AddIn.csproj | 11 +++- .../Project/Debugger.Core.csproj | 5 +- .../TreeListView/Project/TreeListView.csproj | 10 ++- .../Project/FiletypeRegisterer.csproj | 11 +++- .../Project/HighlightingEditor.csproj | 10 ++- .../HtmlHelp2JScriptGlobals.vbproj | 12 +++- .../Misc/HtmlHelp2/Project/HtmlHelp2.csproj | 13 ++++ .../Misc/MonoAddIn/Project/MonoAddIn.csproj | 2 +- .../Project/MonoReflectionLoader.csproj | 2 +- .../Misc/NAntAddIn/Project/NAntAddIn.csproj | 5 +- .../PInvokeAddIn/Project/PInvokeAddIn.csproj | 10 ++- .../Misc/RegExpTk/Project/RegExpTk.csproj | 10 ++- src/AddIns/Misc/SharpQuery/SharpQuery.csproj | 2 +- .../SharpReport/SharpReport.csproj | 2 +- .../SharpReportAddin/SharpReportAddin.csproj | 2 +- .../SharpReportCore/SharpReportCore.csproj | 2 +- .../SharpReportWizard/ReportGenerator.csproj | 2 +- .../Misc/StartPage/Project/StartPage.csproj | 10 ++- .../Misc/UnitTesting/UnitTesting.csproj | 2 +- .../WinFormsUI/WinFormsUI.csproj | 14 ++++- .../Project/ICSharpCode.Build.Tasks.csproj | 2 +- .../Project/ICSharpCode.TextEditor.csproj | 4 +- .../NRefactory/Project/NRefactory.csproj | 2 +- .../Project/Configuration/AssemblyInfo.cs | 9 +++ .../Project/ICSharpCode.SharpDevelop.csproj | 2 +- .../Project/Configuration/AssemblyInfo.cs | 3 + src/Main/StartUp/Project/StartUp.csproj | 2 +- 39 files changed, 252 insertions(+), 46 deletions(-) create mode 100644 doc/AssemblyBaseAddresses.txt diff --git a/doc/AssemblyBaseAddresses.txt b/doc/AssemblyBaseAddresses.txt new file mode 100644 index 0000000000..8e96fe48fe --- /dev/null +++ b/doc/AssemblyBaseAddresses.txt @@ -0,0 +1,61 @@ +To be on the safe side and leave enough space for the future, +the in-memory size of an assembly used here should be 8 times the disk image size. + +Sysinternals Processexplorer can show relocated assemblies in yellow in the DLL View. + +adr = 0x5000000 +def AddModule(kbsize as int): + print "0x${adr.ToString('x')} - 0x${(adr + 3 * kbsize * 1024).ToString('x')}" + adr += 8 * kbsize * 1024 + adr = 0x80000 * System.Math.Ceiling(cast(double,adr) / 0x80000) + +def AddModules(*names as (string)): + for name in names: + System.Console.Write("${name}:\t") + AddModule(System.IO.FileInfo("d:\\corsavy\\sharpdevelop\\bin\\" + name + ".dll").Length / 1024) + +AssemblyName: startaddress - endaddress +ICSharpCode.Core: 0x5000000 - 0x504e000 +ICSharpCode.SharpDevelop: 0x5100000 - 0x5472000 +ICSharpCode.NRefactory: 0x5a80000 - 0x5b9a000 +ICSharpCode.TextEditor: 0x5d80000 - 0x5e67000 +MonoReflectionLoader: 0x6000000 - 0x600c000 +WeifenLuo.WinFormsUI.Docking: 0x6080000 - 0x6107000 +ICSharpCode.Build.Tasks: 0x6200000 - 0x621b000 + +CSharpBinding: 0x6280000 - 0x62bc000 +ILAsmBinding: 0x6380000 - 0x639b000 +VBNetBinding: 0x6400000 - 0x643f000 +NRefactoryToBooConverter: 0x6500000 - 0x6536000 +BooBinding: 0x6600000 - 0x664e000 + +FormsDesigner: 0x6700000 - 0x676f000 +ResourceEditor: 0x6880000 - 0x689e000 +XmlEditor: 0x6900000 - 0x6948000 + +ICSharpCode.AddInMananger: 0x6a00000 - 0x6a24000 +AddInScout: 0x6a80000 - 0x6a8b400 +CodeCoverage: 0x6b00000 - 0x6b30000 +TreeListView (debugger): 0x6b80000 - 0x6be6000 +Debugger.Code: 0x6d00000 - 0x6ddb000 +Debugger.AddIn: 0x6f80000 - 0x6faa000 +FileTypeRegisterer: 0x7000000 - 0x7009000 +HighlightingEditor: 0x7080000 - 0x70ec000 +HtmlHelp2: 0x7200000 - 0x723f000 +HtmlHelp2JScriptGlobals: 0x7300000 - 0x7306c00 +MonoAddIn: 0x7380000 - 0x7395000 +NAntAddIn: 0x7400000 - 0x7427000 +PInvokeAddIn: 0x7480000 - 0x749b000 +RegExpTk: 0x7500000 - 0x7524000 +SharpQuery: 0x7580000 - 0x75b0000 +SharpReportCore: 0x7600000 - 0x7654000 +SharpReport: 0x7700000 - 0x773c000 +SharpReportAddIn: 0x7800000 - 0x781e000 +ReportGenerator: 0x7880000 - 0x78a1000 +StartPage: 0x7900000 - 0x791e000 +UnitTesting: 0x7980000 - 0x799b000 + +Next free address: 0x7a00000 + + + diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj index c02726d9cd..e35be6c90f 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj @@ -10,7 +10,7 @@ False False Auto - 4194304 + 106954752 AnyCPU 4096 4 diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/NRefactoryToBooConverter.csproj b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/NRefactoryToBooConverter.csproj index 505a800b5a..4233cf143d 100644 --- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/NRefactoryToBooConverter.csproj +++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/NRefactoryToBooConverter.csproj @@ -6,6 +6,18 @@ Debug AnyCPU {DBCF20A1-BA13-4582-BFA9-74DE4D987B73} + False + False + False + None + False + Auto + 105906176 + AnyCPU + 4096 + 4 + false + false bin\Debug\ diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj index c2da85821c..0e912d36b8 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj @@ -12,9 +12,17 @@ OnSuccessfulBuild Library File + False + False + Auto + 103284736 + AnyCPU + 4096 + 4 + false - True + true Full False True diff --git a/src/AddIns/BackendBindings/ILAsmBinding/Project/ILAsmBinding.csproj b/src/AddIns/BackendBindings/ILAsmBinding/Project/ILAsmBinding.csproj index 5b2d2cd719..9c5dfab648 100644 --- a/src/AddIns/BackendBindings/ILAsmBinding/Project/ILAsmBinding.csproj +++ b/src/AddIns/BackendBindings/ILAsmBinding/Project/ILAsmBinding.csproj @@ -13,13 +13,20 @@ False OnSuccessfulBuild Library + False + False + Auto + 104333312 + AnyCPU + 4096 + false - True + true False True ..\..\..\..\..\AddIns\AddIns\BackendBindings\ILAsmBinding\ - full + Full False diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj index b2cd248be5..e4d3a51bb1 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj @@ -13,13 +13,20 @@ OnSuccessfulBuild Library File + False + False + Auto + 104857600 + AnyCPU + 4096 - True + true False True ..\..\..\..\..\AddIns\AddIns\BackendBindings\VBNetBinding\ - False + false + Full False diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj index e40a91a61a..3c44141c30 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj @@ -21,7 +21,7 @@ False ..\..\..\..\..\AddIns\AddIns\DisplayBindings\FormsDesigner\ true - 4194304 + 108003328 4096 diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj index 58ef5c8f53..aea2f0b23e 100644 --- a/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj @@ -12,13 +12,22 @@ Library File ResourceEditor + False + False + Auto + 109576192 + AnyCPU + 4096 + 4 + false - True + true False True ..\..\..\..\..\AddIns\AddIns\DisplayBindings\ResourceEditor\ DEBUG + Full False diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.csproj b/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.csproj index 9cd81ef6f1..218f15c9c0 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.csproj +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.csproj @@ -16,7 +16,7 @@ ..\..\..\..\..\bin\SharpDevelop.exe False Auto - 4194304 + 110100480 AnyCPU 4096 0618 diff --git a/src/AddIns/Misc/AddInManager/Project/AddInManager.csproj b/src/AddIns/Misc/AddInManager/Project/AddInManager.csproj index dfceeebb12..be9907234e 100644 --- a/src/AddIns/Misc/AddInManager/Project/AddInManager.csproj +++ b/src/AddIns/Misc/AddInManager/Project/AddInManager.csproj @@ -10,7 +10,7 @@ False False Auto - 4194304 + 111149056 AnyCPU 4096 4 diff --git a/src/AddIns/Misc/AddinScout/Project/AddinScout.csproj b/src/AddIns/Misc/AddinScout/Project/AddinScout.csproj index 125ddd9763..e5cf99436a 100644 --- a/src/AddIns/Misc/AddinScout/Project/AddinScout.csproj +++ b/src/AddIns/Misc/AddinScout/Project/AddinScout.csproj @@ -13,12 +13,21 @@ False OnSuccessfulBuild Library + False + False + False + Auto + 111673344 + AnyCPU + 4096 + false - True + true False DEBUG ..\..\..\..\..\AddIns\AddIns\Misc\AddinScout\ + Full False diff --git a/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj b/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj index f28a6a4804..8ce4a21bf1 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj +++ b/src/AddIns/Misc/CodeCoverage/Project/CodeCoverage.csproj @@ -10,7 +10,7 @@ False False Auto - 4194304 + 112197632 AnyCPU 4096 4 diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj index f4dc63cdcf..5844a3e9be 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj @@ -9,10 +9,19 @@ Debugger.AddIn Debugger.AddIn 4 + False + False + False + False + Auto + 116916224 + AnyCPU + 4096 + false true - full + Full false ..\..\..\..\..\..\AddIns\AddIns\Misc\Debugger\ DEBUG;TRACE diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj index 40c641edd2..4386a2dab9 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj @@ -13,7 +13,7 @@ False False Auto - 4194304 + 114294784 AnyCPU 4096 4 @@ -21,11 +21,12 @@ true - full + Full 108 ..\..\..\..\..\..\AddIns\AddIns\Misc\Debugger\ DEBUG;TRACE True + False PdbOnly diff --git a/src/AddIns/Misc/Debugger/TreeListView/Project/TreeListView.csproj b/src/AddIns/Misc/Debugger/TreeListView/Project/TreeListView.csproj index ca573e9888..dd05ded1b2 100644 --- a/src/AddIns/Misc/Debugger/TreeListView/Project/TreeListView.csproj +++ b/src/AddIns/Misc/Debugger/TreeListView/Project/TreeListView.csproj @@ -9,10 +9,18 @@ TreeListView TreeListView 4 + False + False + False + Auto + 112721920 + AnyCPU + 4096 + false true - full + Full false ..\..\..\..\..\..\AddIns\AddIns\Misc\Debugger\ DEBUG;TRACE diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.csproj b/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.csproj index 12bf1b5c67..ab6832f5e3 100644 --- a/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.csproj +++ b/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.csproj @@ -13,12 +13,21 @@ OnSuccessfulBuild Library ICSharpCode.FiletypeRegisterer + False + False + False + Auto + 117440512 + AnyCPU + 4096 + false - True + true False ..\..\..\..\..\AddIns\AddIns\Misc\FiletypeRegisterer\ DEBUG + Full False diff --git a/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.csproj b/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.csproj index bea20cdbd9..b558189e01 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.csproj +++ b/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.csproj @@ -12,15 +12,21 @@ False OnSuccessfulBuild Library + False + Auto + 117964800 + AnyCPU + 4096 - True + true False False True ..\..\..\..\..\AddIns\AddIns\Misc\HighlightingEditor\ - False + false DEBUG + Full False diff --git a/src/AddIns/Misc/HtmlHelp2/JScriptGlobals/HtmlHelp2JScriptGlobals.vbproj b/src/AddIns/Misc/HtmlHelp2/JScriptGlobals/HtmlHelp2JScriptGlobals.vbproj index 98b49f8519..8ceb27523b 100644 --- a/src/AddIns/Misc/HtmlHelp2/JScriptGlobals/HtmlHelp2JScriptGlobals.vbproj +++ b/src/AddIns/Misc/HtmlHelp2/JScriptGlobals/HtmlHelp2JScriptGlobals.vbproj @@ -7,12 +7,22 @@ AnyCPU Windows {E54A5AD2-418D-4A85-BA5E-CD803DE38715} + False + On + Off + Binary + False + Auto + 120586240 + AnyCPU + 4 + false bin\Debug\ False DEBUG,TRACE - True + true Full diff --git a/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.csproj b/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.csproj index 146b159c02..c0c6492583 100644 --- a/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.csproj +++ b/src/AddIns/Misc/HtmlHelp2/Project/HtmlHelp2.csproj @@ -9,10 +9,23 @@ 8.0.50215 2.0 Resources\dynamichelp.res + False + False + False + None + False + Auto + 119537664 + AnyCPU + 4096 + 4 + false + false ..\..\..\..\..\AddIns\AddIns\Misc\HtmlHelp2\ DEBUG;TRACE + False ..\..\..\..\..\AddIns\AddIns\Misc\HtmlHelp2\ diff --git a/src/AddIns/Misc/MonoAddIn/Project/MonoAddIn.csproj b/src/AddIns/Misc/MonoAddIn/Project/MonoAddIn.csproj index 82165fc163..9f6e163376 100644 --- a/src/AddIns/Misc/MonoAddIn/Project/MonoAddIn.csproj +++ b/src/AddIns/Misc/MonoAddIn/Project/MonoAddIn.csproj @@ -10,7 +10,7 @@ False False Auto - 4194304 + 121110528 AnyCPU 4096 4 diff --git a/src/AddIns/Misc/MonoReflectionLoader/Project/MonoReflectionLoader.csproj b/src/AddIns/Misc/MonoReflectionLoader/Project/MonoReflectionLoader.csproj index f79c63b86b..c5b0102e8d 100644 --- a/src/AddIns/Misc/MonoReflectionLoader/Project/MonoReflectionLoader.csproj +++ b/src/AddIns/Misc/MonoReflectionLoader/Project/MonoReflectionLoader.csproj @@ -10,7 +10,7 @@ False False Auto - 92274688 + 100663296 AnyCPU 4096 4 diff --git a/src/AddIns/Misc/NAntAddIn/Project/NAntAddIn.csproj b/src/AddIns/Misc/NAntAddIn/Project/NAntAddIn.csproj index 60b1b61512..9b4f6577f4 100644 --- a/src/AddIns/Misc/NAntAddIn/Project/NAntAddIn.csproj +++ b/src/AddIns/Misc/NAntAddIn/Project/NAntAddIn.csproj @@ -13,12 +13,12 @@ Full False Auto - 4194304 + 121634816 AnyCPU 4096 + true - true False False True @@ -26,7 +26,6 @@ false - False True False False diff --git a/src/AddIns/Misc/PInvokeAddIn/Project/PInvokeAddIn.csproj b/src/AddIns/Misc/PInvokeAddIn/Project/PInvokeAddIn.csproj index c20c9fb1c4..cae34383d9 100644 --- a/src/AddIns/Misc/PInvokeAddIn/Project/PInvokeAddIn.csproj +++ b/src/AddIns/Misc/PInvokeAddIn/Project/PInvokeAddIn.csproj @@ -10,14 +10,20 @@ 4 False False + False + Auto + 122159104 + AnyCPU + 4096 - True + true False False True ..\..\..\..\..\AddIns\AddIns\Misc\PInvokeAddIn\ - False + false + Full False diff --git a/src/AddIns/Misc/RegExpTk/Project/RegExpTk.csproj b/src/AddIns/Misc/RegExpTk/Project/RegExpTk.csproj index e646f94319..7e979ccd7b 100644 --- a/src/AddIns/Misc/RegExpTk/Project/RegExpTk.csproj +++ b/src/AddIns/Misc/RegExpTk/Project/RegExpTk.csproj @@ -12,15 +12,21 @@ False OnSuccessfulBuild Library + False + Auto + 122683392 + AnyCPU + 4096 - True + true False False True ..\..\..\..\..\AddIns\AddIns\Misc\RegExpTk\ - False + false DEBUG + Full False diff --git a/src/AddIns/Misc/SharpQuery/SharpQuery.csproj b/src/AddIns/Misc/SharpQuery/SharpQuery.csproj index c04200ed61..4b1e5934d1 100644 --- a/src/AddIns/Misc/SharpQuery/SharpQuery.csproj +++ b/src/AddIns/Misc/SharpQuery/SharpQuery.csproj @@ -13,7 +13,7 @@ OnSuccessfulBuild False Auto - 4194304 + 123207680 AnyCPU 4096 Program diff --git a/src/AddIns/Misc/SharpReport/SharpReport/SharpReport.csproj b/src/AddIns/Misc/SharpReport/SharpReport/SharpReport.csproj index 03c4d31708..4f549a1b45 100644 --- a/src/AddIns/Misc/SharpReport/SharpReport/SharpReport.csproj +++ b/src/AddIns/Misc/SharpReport/SharpReport/SharpReport.csproj @@ -10,7 +10,7 @@ False False Auto - 4194304 + 124780544 AnyCPU 4096 4 diff --git a/src/AddIns/Misc/SharpReport/SharpReportAddin/SharpReportAddin.csproj b/src/AddIns/Misc/SharpReport/SharpReportAddin/SharpReportAddin.csproj index 74cf0b72e6..6aa25059fb 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportAddin/SharpReportAddin.csproj +++ b/src/AddIns/Misc/SharpReport/SharpReportAddin/SharpReportAddin.csproj @@ -10,7 +10,7 @@ False False Auto - 4194304 + 125829120 AnyCPU 4096 4 diff --git a/src/AddIns/Misc/SharpReport/SharpReportCore/SharpReportCore.csproj b/src/AddIns/Misc/SharpReport/SharpReportCore/SharpReportCore.csproj index a4f13916e9..5cccbf2369 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportCore/SharpReportCore.csproj +++ b/src/AddIns/Misc/SharpReport/SharpReportCore/SharpReportCore.csproj @@ -10,7 +10,7 @@ False False Auto - 4194304 + 123731968 AnyCPU 4096 4 diff --git a/src/AddIns/Misc/SharpReport/SharpReportWizard/ReportGenerator.csproj b/src/AddIns/Misc/SharpReport/SharpReportWizard/ReportGenerator.csproj index 8a3d1cc2b7..476fc8d0ba 100644 --- a/src/AddIns/Misc/SharpReport/SharpReportWizard/ReportGenerator.csproj +++ b/src/AddIns/Misc/SharpReport/SharpReportWizard/ReportGenerator.csproj @@ -10,7 +10,7 @@ False False Auto - 4194304 + 126353408 AnyCPU 4096 4 diff --git a/src/AddIns/Misc/StartPage/Project/StartPage.csproj b/src/AddIns/Misc/StartPage/Project/StartPage.csproj index 6cfb69295e..fac5010148 100644 --- a/src/AddIns/Misc/StartPage/Project/StartPage.csproj +++ b/src/AddIns/Misc/StartPage/Project/StartPage.csproj @@ -13,15 +13,21 @@ OnSuccessfulBuild Library ICSharpCode.StartPage + False + Auto + 126877696 + AnyCPU + 4096 - True + true False False True ..\..\..\..\..\AddIns\AddIns\Misc\StartPage\ - True + true DEBUG + Full False diff --git a/src/AddIns/Misc/UnitTesting/UnitTesting.csproj b/src/AddIns/Misc/UnitTesting/UnitTesting.csproj index 1e64c4a4b6..27558dae90 100644 --- a/src/AddIns/Misc/UnitTesting/UnitTesting.csproj +++ b/src/AddIns/Misc/UnitTesting/UnitTesting.csproj @@ -11,7 +11,7 @@ False False Auto - 4194304 + 127401984 AnyCPU 4096 4 diff --git a/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj b/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj index 456ee55db8..82855efb13 100644 --- a/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj +++ b/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj @@ -16,10 +16,12 @@ WeifenLuo.WinFormsUI OnBuildSuccess true + Auto + AnyCPU bin\Debug\ - 285212672 + 101187584 false DEBUG;TRACE true @@ -28,11 +30,16 @@ false 4 -Microsoft.Design#CA1012;-Microsoft.Design#CA2210;-Microsoft.Design#CA1040;-Microsoft.Design#CA1005;-Microsoft.Design#CA1020;-Microsoft.Design#CA1021;-Microsoft.Design#CA1010;-Microsoft.Design#CA1011;-Microsoft.Design#CA1009;-Microsoft.Design#CA1050;-Microsoft.Design#CA1026;-Microsoft.Design#CA1019;-Microsoft.Design#CA1031;-Microsoft.Design#CA1047;-Microsoft.Design#CA1000;-Microsoft.Design#CA1048;-Microsoft.Design#CA1051;-Microsoft.Design#CA1002;-Microsoft.Design#CA1061;-Microsoft.Design#CA1006;-Microsoft.Design#CA1046;-Microsoft.Design#CA1045;-Microsoft.Design#CA1038;-Microsoft.Design#CA1008;-Microsoft.Design#CA1028;-Microsoft.Design#CA1004;-Microsoft.Design#CA1035;-Microsoft.Design#CA1063;-Microsoft.Design#CA1032;-Microsoft.Design#CA1023;-Microsoft.Design#CA1033;-Microsoft.Design#CA1039;-Microsoft.Design#CA1016;-Microsoft.Design#CA1014;-Microsoft.Design#CA1017;-Microsoft.Design#CA1018;-Microsoft.Design#CA1027;-Microsoft.Design#CA1059;-Microsoft.Design#CA1060;-Microsoft.Design#CA1034;-Microsoft.Design#CA1013;-Microsoft.Design#CA1036;-Microsoft.Design#CA1044;-Microsoft.Design#CA1041;-Microsoft.Design#CA1025;-Microsoft.Design#CA1052;-Microsoft.Design#CA1053;-Microsoft.Design#CA1057;-Microsoft.Design#CA1058;-Microsoft.Design#CA1001;-Microsoft.Design#CA1049;-Microsoft.Design#CA1054;-Microsoft.Design#CA1056;-Microsoft.Design#CA1055;-Microsoft.Design#CA1030;-Microsoft.Design#CA1003;-Microsoft.Design#CA1007;-Microsoft.Design#CA1043;-Microsoft.Design#CA1024;-Microsoft.Design#CA1062;-Microsoft.Globalization#CA1301;-Microsoft.Globalization#CA1302;-Microsoft.Globalization#CA1303;-Microsoft.Globalization#CA1306;-Microsoft.Globalization#CA1304;-Microsoft.Globalization#CA1305;-Microsoft.Globalization#CA1300;-Microsoft.Maintainability#CA1502;-Microsoft.Maintainability#CA1501;-Microsoft.Maintainability#CA1500;-Microsoft.Naming#CA1718;-Microsoft.Naming#CA1720;-Microsoft.Naming#CA1700;-Microsoft.Naming#CA1712;-Microsoft.Naming#CA1713;-Microsoft.Naming#CA1709;-Microsoft.Naming#CA1708;-Microsoft.Naming#CA1715;-Microsoft.Naming#CA1710;-Microsoft.Naming#CA1707;-Microsoft.Naming#CA1722;-Microsoft.Naming#CA1711;-Microsoft.Naming#CA1716;-Microsoft.Naming#CA1705;-Microsoft.Naming#CA1725;-Microsoft.Naming#CA1719;-Microsoft.Naming#CA1721;-Microsoft.Naming#CA1706;-Microsoft.Naming#CA1724;-Microsoft.Naming#CA1726;-Microsoft.Performance#CA1809;-Microsoft.Performance#CA1811;-Microsoft.Performance#CA1812;-Microsoft.Performance#CA1807;-Microsoft.Performance#CA1813;-Microsoft.Performance#CA1823;-Microsoft.Performance#CA1816;-Microsoft.Performance#CA1817;-Microsoft.Performance#CA1800;-Microsoft.Performance#CA1818;-Microsoft.Performance#CA1805;-Microsoft.Performance#CA1810;-Microsoft.Performance#CA1822;-Microsoft.Performance#CA1815;-Microsoft.Performance#CA1814;-Microsoft.Performance#CA1819;-Microsoft.Performance#CA1804;-Microsoft.Performance#CA1820;-Microsoft.Performance#CA1802;-Microsoft.Security#CA2116;-Microsoft.Security#CA2117;-Microsoft.Security#CA2105;-Microsoft.Security#CA2115;-Microsoft.Security#CA2104;-Microsoft.Security#CA2122;-Microsoft.Security#CA2114;-Microsoft.Security#CA2123;-Microsoft.Security#CA2111;-Microsoft.Security#CA2108;-Microsoft.Security#CA2107;-Microsoft.Security#CA2103;-Microsoft.Security#CA2100;-Microsoft.Security#CA2118;-Microsoft.Security#CA2109;-Microsoft.Security#CA2119;-Microsoft.Security#CA2106;-Microsoft.Security#CA2112;-Microsoft.Security#CA2110;-Microsoft.Security#CA2120;-Microsoft.Security#CA2101;-Microsoft.Security#CA2121;-Microsoft.Security#CA2126;-Microsoft.Security#CA2124;-Microsoft.Usage#CA2209;-Microsoft.Usage#CA2236;-Microsoft.Usage#CA2227;-Microsoft.Usage#CA2213;-Microsoft.Usage#CA2216;-Microsoft.Usage#CA2215;-Microsoft.Usage#CA2214;-Microsoft.Usage#CA2222;-Microsoft.Usage#CA2202;-Microsoft.Usage#CA1806;-Microsoft.Usage#CA2217;-Microsoft.Usage#CA2212;-Microsoft.Usage#CA2219;-Microsoft.Usage#CA2201;-Microsoft.Usage#CA2228;-Microsoft.Usage#CA2221;-Microsoft.Usage#CA2220;-Microsoft.Usage#CA2240;-Microsoft.Usage#CA2229;-Microsoft.Usage#CA2238;-Microsoft.Usage#CA2207;-Microsoft.Usage#CA2208;-Microsoft.Usage#CA2235;-Microsoft.Usage#CA2237;-Microsoft.Usage#CA2232;-Microsoft.Usage#CA2223;-Microsoft.Usage#CA2211;-Microsoft.Usage#CA2233;-Microsoft.Usage#CA2225;-Microsoft.Usage#CA2226;-Microsoft.Usage#CA2231;-Microsoft.Usage#CA2224;-Microsoft.Usage#CA2218;-Microsoft.Usage#CA2234;-Microsoft.Usage#CA2241;-Microsoft.Usage#CA2239;-Microsoft.Usage#CA2200;-Microsoft.Usage#CA1801;-Microsoft.Usage#CA2205;-Microsoft.Usage#CA2230 + Full + False + False + False + false bin\Release\ false - 285212672 + 101187584 false TRACE false @@ -43,6 +50,7 @@ false false 4 + None @@ -252,4 +260,4 @@ - + \ No newline at end of file diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj b/src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj index 4d2d97be9b..2337c3911c 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj @@ -12,7 +12,7 @@ None False Auto - 92405760 + 102760448 AnyCPU 4096 4 diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/ICSharpCode.TextEditor.csproj b/src/Libraries/ICSharpCode.TextEditor/Project/ICSharpCode.TextEditor.csproj index a84f0da338..0fefcfec47 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/ICSharpCode.TextEditor.csproj +++ b/src/Libraries/ICSharpCode.TextEditor/Project/ICSharpCode.TextEditor.csproj @@ -17,7 +17,7 @@ ICSharpCode.TextEditor False Auto - 90177536 + 98041856 AnyCPU 4096 @@ -200,4 +200,4 @@ - + \ No newline at end of file diff --git a/src/Libraries/NRefactory/Project/NRefactory.csproj b/src/Libraries/NRefactory/Project/NRefactory.csproj index e733bc61a9..e7b876f06c 100644 --- a/src/Libraries/NRefactory/Project/NRefactory.csproj +++ b/src/Libraries/NRefactory/Project/NRefactory.csproj @@ -18,7 +18,7 @@ False False Auto - 88080384 + 94896128 AnyCPU 4096 diff --git a/src/Main/Base/Project/Configuration/AssemblyInfo.cs b/src/Main/Base/Project/Configuration/AssemblyInfo.cs index dc11f3140b..39fcb58b2f 100644 --- a/src/Main/Base/Project/Configuration/AssemblyInfo.cs +++ b/src/Main/Base/Project/Configuration/AssemblyInfo.cs @@ -13,6 +13,15 @@ using System.Runtime.CompilerServices; [assembly: CLSCompliant(false)] [assembly: StringFreezing()] +// Use hard-binding for ICSharpCode.SharpDevelop: +[assembly: Dependency("ICSharpCode.Core", LoadHint.Always)] +[assembly: Dependency("ICSharpCode.TextEditor", LoadHint.Always)] +[assembly: Dependency("ICSharpCode.NRefactory", LoadHint.Always)] +[assembly: Dependency("System.Drawing", LoadHint.Always)] +[assembly: Dependency("System.Xml", LoadHint.Always)] +[assembly: Dependency("System.Windows.Forms", LoadHint.Always)] +[assembly: Dependency("WeifenLuo.WinFormsUI.Docking", LoadHint.Always)] + [assembly: AssemblyTitle("SharpDevelopBase")] [assembly: AssemblyDescription("The base add-in of SharpDevelop")] [assembly: AssemblyConfiguration("")] diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index aeeeeafdcc..6969ebc577 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -16,7 +16,7 @@ False False Auto - 84410368 + 84934656 AnyCPU 4096 false diff --git a/src/Main/Core/Project/Configuration/AssemblyInfo.cs b/src/Main/Core/Project/Configuration/AssemblyInfo.cs index ac28a4b6cb..bc97665c4a 100644 --- a/src/Main/Core/Project/Configuration/AssemblyInfo.cs +++ b/src/Main/Core/Project/Configuration/AssemblyInfo.cs @@ -12,6 +12,9 @@ using System.Runtime.CompilerServices; [assembly: CLSCompliant(true)] [assembly: StringFreezing()] +// Use hard-binding for ICSharpCode.Core: +[assembly: Dependency("log4net", LoadHint.Always)] + [assembly: AssemblyTitle("ICSharpCode.Core")] [assembly: AssemblyDescription("The ICSharpCode Core containing the AddInTree and service Subsystem")] [assembly: AssemblyConfiguration("")] diff --git a/src/Main/StartUp/Project/StartUp.csproj b/src/Main/StartUp/Project/StartUp.csproj index c2d9c33a09..5d65cf8473 100644 --- a/src/Main/StartUp/Project/StartUp.csproj +++ b/src/Main/StartUp/Project/StartUp.csproj @@ -13,7 +13,7 @@ Resources\StartUp.snk .\Resources\SharpDevelop.ico ..\src\Tools\UpdateAssemblyInfo\bin\Debug\UpdateAssemblyInfo.exe StartupOnly - 92798976 + 4194304 False False Auto From 49cb637e82e85c557c75dabe4c773b36889471aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sun, 30 Apr 2006 19:58:12 +0000 Subject: [PATCH 40/49] Indexers not shown in debugger tooltips (Forum-7247) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1378 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs index b9538f8c50..b16044cdf3 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs @@ -155,7 +155,7 @@ namespace Debugger { foreach(MethodProps m in Methods) { MethodProps method = m; // One per scope/delegate - if (method.Name.StartsWith("get_") && method.HasSpecialName) { + if (method.HasSpecialName && method.Name.StartsWith("get_") && method.Name != "get_Item") { yield return new PropertyVariable(debugger, method.Name.Remove(0, 4), method.IsStatic, From 16d87fd62ebeb8cff4b6a11b316b2648313e71bb Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 1 May 2006 12:09:35 +0000 Subject: [PATCH 41/49] Fixed SD2-797: Code-completion for nested classes is broken git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1379 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../file/CSharp/CSharp.Web.WebControl.xft | 2 +- .../file/CSharp/CSharp.Web.WebService.xft | 2 +- .../Boo/BooBinding/Project/Src/BooProject.cs | 9 ++ .../Src/CodeCompletion/ConvertVisitor.cs | 18 ++-- .../Src/CodeCompletion/ResolveVisitor.cs | 21 +++-- .../Boo/BooBinding/Test/ResolverTests.cs | 92 ++++++++++++++++--- .../NRefactoryResolver/NRefactoryResolver.cs | 13 +-- .../Base/Project/Src/Dom/ResolveResult.cs | 4 +- .../ParserService/DefaultProjectContent.cs | 14 +-- .../ParserService/ParseProjectContent.cs | 7 ++ .../Services/ParserService/ParserService.cs | 23 ++++- .../Base/Test/InnerClassesResolverTests.cs | 15 +++ 12 files changed, 177 insertions(+), 43 deletions(-) diff --git a/data/templates/file/CSharp/CSharp.Web.WebControl.xft b/data/templates/file/CSharp/CSharp.Web.WebControl.xft index b79171d9a7..7cdbd35d1c 100644 --- a/data/templates/file/CSharp/CSharp.Web.WebControl.xft +++ b/data/templates/file/CSharp/CSharp.Web.WebControl.xft @@ -6,7 +6,7 @@ icon = "C#.File.NewClass" category = "C#" subcategory = "ASP.NET" - defaultname = "WebControl" + defaultname = "WebControl${Number}" language = "C#" /> diff --git a/data/templates/file/CSharp/CSharp.Web.WebService.xft b/data/templates/file/CSharp/CSharp.Web.WebService.xft index b1e39f51cb..c6dd1e03f8 100644 --- a/data/templates/file/CSharp/CSharp.Web.WebService.xft +++ b/data/templates/file/CSharp/CSharp.Web.WebService.xft @@ -6,7 +6,7 @@ icon = "C#.File.NewClass" category = "C#" subcategory = "ASP.NET" - defaultname = "WebService.asmx" + defaultname = "WebService${Number}.asmx" language = "C#" /> diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs index fb1d739860..781b1ee3a7 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs @@ -109,5 +109,14 @@ namespace Grunwald.BooBinding return GetProperty("Ducky", false); } } + + public override void SetProperty(string configurationName, string platform, string property, T value, PropertyStorageLocations location) + { + bool oldDucky = Ducky; + base.SetProperty(configurationName, platform, property, value, location); + if (Ducky != oldDucky) { + ParserService.Reparse(this); + } + } } } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs index ad3a306a49..7c1dc69b91 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs @@ -213,17 +213,23 @@ namespace Grunwald.BooBinding.CodeCompletion return CreateReturnType(reference, c, method, c.Region.BeginLine + 1, 1, _cu.ProjectContent); } } + + internal static IReturnType GetDefaultReturnType(IProjectContent projectContent) + { + BooProject project = projectContent.Project as BooProject; + if (project != null && project.Ducky) + return new BooResolver.DuckClass(new DefaultCompilationUnit(projectContent)).DefaultReturnType; + else + return ReflectionReturnType.Object; + } + public static IReturnType CreateReturnType(AST.TypeReference reference, IClass callingClass, IMethodOrProperty callingMember, int caretLine, int caretColumn, IProjectContent projectContent) { System.Diagnostics.Debug.Assert(projectContent != null); if (reference == null) { - BooProject project = projectContent.Project as BooProject; - if (project != null && project.Ducky) - return new BooResolver.DuckClass(new DefaultCompilationUnit(projectContent)).DefaultReturnType; - else - return ReflectionReturnType.Object; + return GetDefaultReturnType(projectContent); } if (reference is AST.ArrayTypeReference) { AST.ArrayTypeReference arr = (AST.ArrayTypeReference)reference; @@ -278,7 +284,7 @@ namespace Grunwald.BooBinding.CodeCompletion if (field.Initializer != null) return new InferredReturnType(field.Initializer, OuterClass); else - return ReflectionReturnType.Object; + return GetDefaultReturnType(_cu.ProjectContent); } else { return CreateReturnType(field.Type); } 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 8097adf281..446326d53c 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs @@ -168,9 +168,14 @@ namespace Grunwald.BooBinding.CodeCompletion } } } - if (callingClass != null) { - if (ResolveMember(callingClass.DefaultReturnType, identifier)) - return true; + + { // Find members of this class or enclosing classes + IClass tmp = callingClass; + while (tmp != null) { + if (ResolveMember(tmp.DefaultReturnType, identifier)) + return true; + tmp = tmp.DeclaringType; + } } string namespaceName = projectContent.SearchNamespace(identifier, callingClass, cu, resolver.CaretLine, resolver.CaretColumn); @@ -294,10 +299,12 @@ namespace Grunwald.BooBinding.CodeCompletion if (resolveResult is TypeResolveResult) { IClass rClass = (resolveResult as TypeResolveResult).ResolvedClass; if (rClass != null) { - foreach (IClass innerClass in rClass.InnerClasses) { - if (IsSameName(innerClass.Name, node.Name)) { - MakeTypeResult(innerClass); - return; + foreach (IClass baseClass in rClass.ClassInheritanceTree) { + foreach (IClass innerClass in baseClass.InnerClasses) { + if (IsSameName(innerClass.Name, node.Name)) { + MakeTypeResult(innerClass); + return; + } } } } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs index 2803ab4dbd..81d0f57ab4 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -29,16 +29,6 @@ namespace Grunwald.BooBinding.Tests return Resolve(normalProg, code, marker); } - T ResolveReg(string code) where T : ResolveResult - { - return ResolveReg(code, "/*1*/"); - } - - T ResolveReg(string code, string marker) where T : ResolveResult - { - return Resolve(regressionProg, code, marker); - } - T Resolve(string prog, string code, string marker) where T : ResolveResult { ResolveResult rr = Resolve(prog, new ExpressionResult(code), marker); @@ -55,10 +45,12 @@ namespace Grunwald.BooBinding.Tests } const string fileName = "tempFile.boo"; + DefaultProjectContent lastPC; void Register(string prog) { DefaultProjectContent pc = new DefaultProjectContent(); + lastPC = pc; ParserService.ForceProjectContent(pc); pc.ReferencedContents.Add(ProjectContentRegistry.Mscorlib); pc.ReferencedContents.Add(ProjectContentRegistry.WinForms); @@ -230,16 +222,16 @@ namespace Grunwald.BooBinding.Tests [Test] public void Boo629VariableScope() { - LocalResolveResult rr = ResolveReg("boo629"); + LocalResolveResult rr = Resolve(regressionProg, "boo629", "/*1*/"); Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName); } [Test] public void Boo640ConditionalAssignment() { - LocalResolveResult rr = ResolveReg("boo640b"); + LocalResolveResult rr = Resolve(regressionProg, "boo640b", "/*1*/"); Assert.AreEqual("System.Reflection.FieldInfo", rr.ResolvedType.FullyQualifiedName); - rr = ResolveReg("boo640a", "/*640*/"); + rr = Resolve(regressionProg, "boo640a", "/*640*/"); Assert.AreEqual("System.Object", rr.ResolvedType.FullyQualifiedName); Assert.IsNull(Resolve(regressionProg, new ExpressionResult("boo640a"), "/*1*/")); } @@ -264,6 +256,80 @@ namespace Grunwald.BooBinding.Tests } #endregion + #region Nested Classes + const string nestedClassProg = + "class Outer:\n" + + "\tpublic static outerField = 1\n" + + "\tpublic class Inner:\n/*inner*/" + + "\t\tpublic innerField = 2\n" + + "class Derived(Outer):\n/*derived*/" + + "\tpublic static derivedField = 3\n" + + "def Method():\n" + + "\ti as Outer.Inner\n" + + "\ti2 as Derived.Inner\n" + + "\t/*1*/"; + + [Test] + public void NestedClassTypeResolution() + { + TypeResolveResult trr; + trr = Resolve(nestedClassProg, "Outer.Inner", "/*1*/"); + Assert.AreEqual("Outer.Inner", trr.ResolvedClass.FullyQualifiedName); + trr = Resolve(nestedClassProg, "Inner", "/*inner*/"); + Assert.AreEqual("Outer.Inner", trr.ResolvedClass.FullyQualifiedName); + trr = Resolve(nestedClassProg, "Inner", "/*derived*/"); + Assert.AreEqual("Outer.Inner", trr.ResolvedClass.FullyQualifiedName); + trr = Resolve(nestedClassProg, "Derived.Inner", "/*1*/"); + Assert.AreEqual("Outer.Inner", trr.ResolvedClass.FullyQualifiedName); + } + + [Test] + public void NestedClassCtrlSpace() + { + CtrlSpace(nestedClassProg.Replace("/*inner*/", "/*mark*/"), "outerField", "innerField", "Inner", "Outer", "Derived"); + CtrlSpace(nestedClassProg.Replace("/*derived*/", "/*mark*/"), "outerField", "derivedField", "Inner", "Outer", "Derived"); + } + + [Test] + public void NestedClassParentStaticField() + { + MemberResolveResult mrr = Resolve(nestedClassProg, "outerField", "/*inner*/"); + Assert.AreEqual("Outer.outerField", mrr.ResolvedMember.FullyQualifiedName); + } + + [Test] + public void NestedClassCC() + { + LocalResolveResult rr = Resolve(nestedClassProg, "i", "/*1*/"); + Assert.AreEqual("Outer.Inner", rr.ResolvedType.FullyQualifiedName); + bool ok = false; + foreach (object o in rr.GetCompletionData(lastPC)) { + IMember m = o as IMember; + if (m != null && m.Name == "innerField") + ok = true; + } + Assert.IsTrue(ok); + MemberResolveResult mrr = Resolve(nestedClassProg, "i.innerField", "/*1*/"); + Assert.AreEqual("Outer.Inner.innerField", mrr.ResolvedMember.FullyQualifiedName); + } + + [Test] + public void NestedClassCC2() + { + LocalResolveResult rr = Resolve(nestedClassProg, "i2", "/*1*/"); + Assert.AreEqual("Outer.Inner", rr.ResolvedType.FullyQualifiedName); + bool ok = false; + foreach (object o in rr.GetCompletionData(lastPC)) { + IMember m = o as IMember; + if (m != null && m.Name == "innerField") + ok = true; + } + Assert.IsTrue(ok); + MemberResolveResult mrr = Resolve(nestedClassProg, "i2.innerField", "/*1*/"); + Assert.AreEqual("Outer.Inner.innerField", mrr.ResolvedMember.FullyQualifiedName); + } + #endregion + #region CtrlSpace void CtrlSpace(string prog, params string[] expected) { diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs index 9350da4ae8..ed94cfbaca 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs @@ -447,11 +447,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return CreateMemberResolveResult(member); c = type.GetUnderlyingClass(); if (c != null) { - List innerClasses = c.InnerClasses; - if (innerClasses != null) { - foreach (IClass innerClass in innerClasses) { - if (IsSameName(innerClass.Name, fieldReferenceExpression.FieldName)) { - return new TypeResolveResult(callingClass, callingMember, innerClass); + foreach (IClass baseClass in c.ClassInheritanceTree) { + List innerClasses = baseClass.InnerClasses; + if (innerClasses != null) { + foreach (IClass innerClass in innerClasses) { + if (IsSameName(innerClass.Name, fieldReferenceExpression.FieldName)) { + return new TypeResolveResult(callingClass, callingMember, innerClass); + } } } } @@ -1051,7 +1053,6 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver members.Clear(); IClass c = callingClass.DeclaringType; while (c != null) { - result.Add(c); t = c.DefaultReturnType; members.AddRange(t.GetMethods()); members.AddRange(t.GetFields()); diff --git a/src/Main/Base/Project/Src/Dom/ResolveResult.cs b/src/Main/Base/Project/Src/Dom/ResolveResult.cs index b4faf42fa6..ce5d3de352 100644 --- a/src/Main/Base/Project/Src/Dom/ResolveResult.cs +++ b/src/Main/Base/Project/Src/Dom/ResolveResult.cs @@ -430,7 +430,9 @@ namespace ICSharpCode.SharpDevelop.Dom { ArrayList ar = GetCompletionData(projectContent.Language, true); if (resolvedClass != null) { - ar.AddRange(resolvedClass.InnerClasses); + foreach (IClass baseClass in resolvedClass.ClassInheritanceTree) { + ar.AddRange(baseClass.InnerClasses); + } } return ar; } diff --git a/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs index 24c13ea348..af61cd208a 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs @@ -565,12 +565,14 @@ namespace ICSharpCode.Core string outerName = typeName.Substring(0, lastIndex); IClass upperClass = GetClassInternal(outerName, typeParameterCount, language); if (upperClass != null) { - List innerClasses = upperClass.InnerClasses; - if (innerClasses != null) { - string innerName = typeName.Substring(lastIndex + 1); - foreach (IClass innerClass in innerClasses) { - if (language.NameComparer.Equals(innerClass.Name, innerName)) { - return innerClass; + foreach (IClass upperBaseClass in upperClass.ClassInheritanceTree) { + List innerClasses = upperBaseClass.InnerClasses; + if (innerClasses != null) { + string innerName = typeName.Substring(lastIndex + 1); + foreach (IClass innerClass in innerClasses) { + if (language.NameComparer.Equals(innerClass.Name, innerName)) { + return innerClass; + } } } } diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs index aeeb5c83bf..828a1c59a4 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs @@ -177,6 +177,13 @@ namespace ICSharpCode.Core return project.Items.Count; } + internal void ReInitialize2() + { + if (initializing) return; + initializing = true; + Initialize2(); + } + internal void Initialize2() { if (!initializing) return; diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs index c7e8b9674a..b9844cf872 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs @@ -182,10 +182,27 @@ namespace ICSharpCode.Core { ParseProjectContent newContent = (ParseProjectContent)state; newContent.Initialize1(); + StatusBarService.ProgressMonitor.BeginTask("Parsing...", newContent.GetInitializationWorkAmount()); newContent.Initialize2(); StatusBarService.ProgressMonitor.Done(); } + static void ReparseProject(object state) + { + ParseProjectContent newContent = (ParseProjectContent)state; + StatusBarService.ProgressMonitor.BeginTask("Parsing...", newContent.GetInitializationWorkAmount()); + newContent.ReInitialize2(); + StatusBarService.ProgressMonitor.Done(); + } + + public static void Reparse(IProject project) + { + ParseProjectContent pc = GetProjectContent(project) as ParseProjectContent; + if (pc != null) { + ThreadPool.QueueUserWorkItem(ReparseProject, pc); + } + } + internal static IProjectContent CreateProjectContentForAddedProject(IProject project) { lock (projectContents) { @@ -198,8 +215,10 @@ namespace ICSharpCode.Core public static IProjectContent GetProjectContent(IProject project) { - if (projectContents.ContainsKey(project)) { - return projectContents[project]; + lock (projectContents) { + if (projectContents.ContainsKey(project)) { + return projectContents[project]; + } } return null; } diff --git a/src/Main/Base/Test/InnerClassesResolverTests.cs b/src/Main/Base/Test/InnerClassesResolverTests.cs index f0f2c21cef..a3e2658842 100644 --- a/src/Main/Base/Test/InnerClassesResolverTests.cs +++ b/src/Main/Base/Test/InnerClassesResolverTests.cs @@ -106,6 +106,21 @@ class C : A { ResolveResult result = Resolve(program, "B", 6); Assert.IsTrue(result is TypeResolveResult); Assert.AreEqual("A.B", result.ResolvedType.FullyQualifiedName); + + result = Resolve(program, "C.B", 6); + Assert.IsTrue(result is TypeResolveResult); + Assert.AreEqual("A.B", result.ResolvedType.FullyQualifiedName); + + result = Resolve(program, "C", 6); + Assert.IsTrue(result is TypeResolveResult); + Assert.AreEqual("C", result.ResolvedType.FullyQualifiedName); + foreach (object o in result.GetCompletionData(nrrt.lastPC)) { + if (o is IClass) { + Assert.AreEqual("A.B", ((IClass)o).FullyQualifiedName); + return; + } + } + Assert.Fail("Inherited inner class not visible."); } } } From 37c2bc671deee3a04ac3f9a1e9749241b47f7ccb Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 1 May 2006 13:53:51 +0000 Subject: [PATCH 42/49] Fixed SD2-783: GDI Handle leak git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1380 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Workbench/Layouts/LayoutConfiguration.cs | 12 ++++-- .../Base/Project/Src/Services/IconService.cs | 12 ++++-- .../Src/TextEditor/Gui/Dialogs/GotoDialog.cs | 23 ++++++---- .../ResourceService/ResourceService.cs | 43 +++++++++++++------ 4 files changed, 63 insertions(+), 27 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/LayoutConfiguration.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/LayoutConfiguration.cs index 14626ed016..97dfdf55bb 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/LayoutConfiguration.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/LayoutConfiguration.cs @@ -90,11 +90,17 @@ namespace ICSharpCode.SharpDevelop.Gui return PropertyService.Get("Workbench.CurrentLayout", "Default"); } set { + if (WorkbenchSingleton.InvokeRequired) + throw new InvalidOperationException("Invoke required"); if (value != CurrentLayoutName) { - PropertyService.Set("Workbench.CurrentLayout", value); - WorkbenchSingleton.SafeThreadCall(WorkbenchSingleton.Workbench.WorkbenchLayout, "LoadConfiguration"); - WorkbenchSingleton.SafeThreadCall(typeof(LayoutConfiguration), "OnLayoutChanged", EventArgs.Empty); + WorkbenchSingleton.Workbench.WorkbenchLayout.LoadConfiguration(); + OnLayoutChanged(EventArgs.Empty); + #if DEBUG + GC.Collect(); + GC.WaitForPendingFinalizers(); + GC.Collect(); + #endif } } } diff --git a/src/Main/Base/Project/Src/Services/IconService.cs b/src/Main/Base/Project/Src/Services/IconService.cs index 4495f74a2f..0673b7934f 100644 --- a/src/Main/Base/Project/Src/Services/IconService.cs +++ b/src/Main/Base/Project/Src/Services/IconService.cs @@ -73,8 +73,9 @@ namespace ICSharpCode.Core public static Bitmap GetBitmap(string name) { - if (ResourceService.GetBitmap(name) != null) { - return ResourceService.GetBitmap(name); + Bitmap bmp = ResourceService.GetBitmap(name); + if (bmp != null) { + return bmp; } return ResourceService.GetBitmap("Icons.16x16.MiscFiles"); @@ -82,8 +83,11 @@ namespace ICSharpCode.Core public static Icon GetIcon(string name) { - Bitmap bitmap = GetBitmap(name); - return Icon.FromHandle(bitmap.GetHicon()); + Icon icon = ResourceService.GetIcon(name); + if (icon != null) { + return icon; + } + return ResourceService.GetIcon("Icons.16x16.MiscFiles"); } diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Dialogs/GotoDialog.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Dialogs/GotoDialog.cs index 4094b6e721..54f2522be6 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Dialogs/GotoDialog.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Dialogs/GotoDialog.cs @@ -7,6 +7,7 @@ using System; using System.Collections; +using System.Collections.Generic; using System.IO; using System.Drawing; using System.ComponentModel; @@ -276,20 +277,26 @@ namespace ICSharpCode.SharpDevelop.Gui foreach (IProject project in ProjectService.OpenSolution.Projects) { IProjectContent projectContent = ParserService.GetProjectContent(project); if (projectContent != null) { - foreach (IClass c in projectContent.Classes) { - string className = c.Name; - if (className.Length >= text.Length) { - if (className.ToLowerInvariant().IndexOf(lowerText) >= 0) { - list.Add(c); - } - } - } + AddClasses(lowerText, list, projectContent.Classes); } } } return list; } + void AddClasses(string lowerText, ArrayList list, IEnumerable classes) + { + foreach (IClass c in classes) { + string className = c.Name; + if (className.Length >= lowerText.Length) { + if (className.ToLowerInvariant().IndexOf(lowerText) >= 0) { + list.Add(c); + } + } + AddClasses(lowerText, list, c.InnerClasses); + } + } + void AddItem(string text, int imageIndex, object tag, double priority) { if (visibleEntries.ContainsKey(text)) diff --git a/src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs b/src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs index c7f8b3f182..f8be596a4a 100644 --- a/src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs +++ b/src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs @@ -65,6 +65,9 @@ namespace ICSharpCode.Core static Hashtable localStrings = null; static Hashtable localIcons = null; + static Dictionary iconCache = new Dictionary(); + static Dictionary bitmapCache = new Dictionary(); + /// Strings resource managers for the current language static List localStringsResMgrs = new List(); /// Image resource managers for the current language @@ -182,6 +185,9 @@ namespace ICSharpCode.Core static void LoadLanguageResources(string language) { + iconCache.Clear(); + bitmapCache.Clear(); + try { Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language); } catch (Exception) { @@ -400,15 +406,22 @@ namespace ICSharpCode.Core /// public static Icon GetIcon(string name) { - object iconobj = GetImageResource(name); - - if (iconobj == null) { - return null; - } - if (iconobj is Icon) { - return (Icon)iconobj; - } else { - return Icon.FromHandle(((Bitmap)iconobj).GetHicon()); + lock (iconCache) { + Icon ico; + if (iconCache.TryGetValue(name, out ico)) + return ico; + + object iconobj = GetImageResource(name); + if (iconobj == null) { + return null; + } + if (iconobj is Icon) { + ico = (Icon)iconobj; + } else { + ico = Icon.FromHandle(((Bitmap)iconobj).GetHicon()); + } + iconCache[name] = ico; + return ico; } } @@ -427,9 +440,15 @@ namespace ICSharpCode.Core /// public static Bitmap GetBitmap(string name) { - Bitmap b = (Bitmap)GetImageResource(name); - Debug.Assert(b != null, "Resource " + name); - return b; + lock (bitmapCache) { + Bitmap bmp; + if (bitmapCache.TryGetValue(name, out bmp)) + return bmp; + bmp = (Bitmap)GetImageResource(name); + Debug.Assert(bmp != null, "Resource " + name); + bitmapCache[name] = bmp; + return bmp; + } } } } From 5753bafcba0369e058fab774fe31c7d5e856e0da Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 2 May 2006 18:29:42 +0000 Subject: [PATCH 43/49] Fixed SD2-796: Building whilst debugging git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1381 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- data/resources/StringResources.cz.resources | Bin 213244 -> 214171 bytes data/resources/StringResources.de.resources | Bin 196190 -> 197908 bytes data/resources/StringResources.hu.resources | Bin 211673 -> 213283 bytes data/resources/StringResources.nl.resources | Bin 211498 -> 212444 bytes .../resources/StringResources.pt-br.resources | Bin 185849 -> 188487 bytes data/resources/StringResources.tr.resources | Bin 141909 -> 213490 bytes .../Project/Src/Commands/BuildCommands.cs | 9 +++++++++ .../Base/Project/Src/Commands/FileCommands.cs | 4 ++-- .../Services/MessageService/MessageService.cs | 18 +++--------------- .../Resources/StringResources.resources | Bin 206716 -> 207940 bytes 10 files changed, 14 insertions(+), 17 deletions(-) diff --git a/data/resources/StringResources.cz.resources b/data/resources/StringResources.cz.resources index 17d2916137d18480522b53d49e9924cd97814e1e..8b1cb2b8e90e0c6be065acf0420f02923756c445 100644 GIT binary patch delta 29857 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 E072n;=l}o! delta 29193 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

U`$)bqOw5Dh;gMq%IZB<$K1 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 delta 27537 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 OZS1$!J8zcYjQfALh;x?! diff --git a/data/resources/StringResources.hu.resources b/data/resources/StringResources.hu.resources index c3243ba54d5c95b709250a33743c822618fb5d7d..7c6486ecb8c81f49271e71dc0c3db8fbb1d78583 100644 GIT binary patch delta 28354 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 diff --git a/data/resources/StringResources.nl.resources b/data/resources/StringResources.nl.resources index bab078f00ac5945445f94b634295d5121234b53f..745db51b2a20f5ecc038b484facd2ee36be216bb 100644 GIT binary patch delta 29902 zcmZ^M30%(E_y4(!u&BmCq zjakf$b%q&?b z^|Z~~v|P}Z_Cz186I8#Apucwr+HE0b-B@F?iQ-_Jh zV6pK}h#nLOdWQM_=LBVTCmPsF(B*8R?y*Ffjzl|pOB(!`Xser~oV9{dsu1;WN%Tki zJV}jy6BMs?i-JCEE@{UXg3j+Js`o&UW00hHFr9=y zPyF?&Ea~sJ1%(e5^ie}eNlB8d{h?4fr|b5KR?C-Jmh|yh}v6 z!9*D|1pQcvsJ)Azb4?`q)fDsq3w`maAUkNMi;%Pd8pv~zG|ElTiRDDQoFoM|C%P6U zX>Sr#?Io$nE^392$eP%n&EY6Qu_czRPwcWMc0RA15~IAs$st^w^$3nzNsis*26 zNz#g=0y@!gnez`(VPB&Jzv5sweSjaWkG;;?TGTC1eL?0zae5;G?p~7 zm84%s!fe+Bg{**&Jry*(lBCSWL{|u^dNqWGc~YM@e7p6Eqzje_O(2HdwqLkwZtKc=+h3F+T^m%0rJevp)-Xf?yY-o1_9y){Q0?d(%_-|2_XgQ=^`9jd> zTunE?eOP$N}YkMlyj0oDs4^Z6x)D+V>;~YS9|1UN0yck+iM`!g(>#pBV3t$VkmY zBKs5eKZOtqn=B{}>bw*qX&!cdt-7G<@X}HCl79Len(>u%aFC$;$P3RjI1-%nEPPPE>i$&F

    CZ$lVp)hk-k%a34x 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 diff --git a/data/resources/StringResources.pt-br.resources b/data/resources/StringResources.pt-br.resources index 22d09fec8b2662e9c113418360357f8c26f4ea99..603ef2ddf31c0e16ac6aff0b77fc78f725c90bf9 100644 GIT binary patch delta 27937 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 ItLF6o0Ms!s)&Kwi diff --git a/data/resources/StringResources.tr.resources b/data/resources/StringResources.tr.resources index e256edcd62d74556b4c204ef95e176a8a7d294fe..a3b53f95c81338acae2438da83c7acb5b3add188 100644 GIT binary patch literal 213490 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 PN7`5h(Cd$e-VXc)A5>d) delta 29190 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 Date: Tue, 2 May 2006 18:48:49 +0000 Subject: [PATCH 44/49] Fixed SD2-786: Opening a .csproj file with no .sln generates a .sln with AnyCPU instead of Any CPU git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1382 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Services/ProjectService/ProjectService.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs index 0bca7a9fbe..00504bd70c 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs @@ -235,6 +235,8 @@ namespace ICSharpCode.SharpDevelop.Project string file = GetPreferenceFileName(openSolution.FileName); if (FileUtility.IsValidFileName(file) && File.Exists(file)) { (openSolution.Preferences as IMementoCapable).SetMemento(Properties.Load(file)); + } else { + (openSolution.Preferences as IMementoCapable).SetMemento(new Properties()); } ApplyConfigurationAndReadPreferences(); } catch (Exception ex) { @@ -299,7 +301,12 @@ namespace ICSharpCode.SharpDevelop.Project ProjectSection configSection = solution.GetSolutionConfigurationsSection(); foreach (string configuration in project.GetConfigurationNames()) { foreach (string platform in project.GetPlatformNames()) { - string key = configuration + "|" + platform; + string key; + if (platform == "AnyCPU") { // Fix for SD2-786 + key = configuration + "|Any CPU"; + } else { + key = configuration + "|" + platform; + } configSection.Items.Add(new SolutionItem(key, key)); } } From 73f4aa7af95e4069c41f089aa61ddb08b53c870e Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 2 May 2006 19:02:09 +0000 Subject: [PATCH 45/49] Fixed SD2-788: Duplicate override method in code completion git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1383 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Dom/Implementations/AbstractDecoration.cs | 2 +- src/Main/Base/Test/NRefactoryResolverTests.cs | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Main/Base/Project/Src/Dom/Implementations/AbstractDecoration.cs b/src/Main/Base/Project/Src/Dom/Implementations/AbstractDecoration.cs index 12afb67c04..26a17aafe3 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/AbstractDecoration.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/AbstractDecoration.cs @@ -166,7 +166,7 @@ namespace ICSharpCode.SharpDevelop.Dom } public bool IsOverridable { get { - return (IsOverride || IsVirtual) && !IsSealed; + return (IsOverride || IsVirtual || IsAbstract) && !IsSealed; } } public bool IsNew { diff --git a/src/Main/Base/Test/NRefactoryResolverTests.cs b/src/Main/Base/Test/NRefactoryResolverTests.cs index cab0f5e9b3..a612d0836f 100644 --- a/src/Main/Base/Test/NRefactoryResolverTests.cs +++ b/src/Main/Base/Test/NRefactoryResolverTests.cs @@ -845,6 +845,37 @@ class B { } return false; } + + [Test] + public void OverriddenMemberVisibilityTest() + { + string program = @"using System; + public abstract class GrandParent { + protected abstract void OverrideMe(); + } + public class Parent: GrandParent { + protected override void OverrideMe() { + } + } + public class Child: Parent { + } +"; + ResolveResult result = Resolve(program, "(Child)someVar", 6); + Assert.AreEqual("Child", result.ResolvedType.FullyQualifiedName); + int count = 0; + foreach (IMethod m in result.ResolvedType.GetMethods()) { + if (m.Name == "OverrideMe") + count += 1; + } + Assert.AreEqual(1, count); + count = 0; + foreach (object o in result.GetCompletionData(lastPC)) { + IMethod m = o as IMethod; + if (m != null && m.Name == "OverrideMe") + count += 1; + } + Assert.AreEqual(1, count); + } #endregion #region MixedType tests From 765a5aa0b3124a10641a5097e1ae7d369a6af646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Tue, 2 May 2006 21:33:50 +0000 Subject: [PATCH 46/49] Hack for variables that change type (Forum-7347) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1384 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Variables/ClassVariable.cs | 4 ++-- .../Debugger.Core/Project/Src/Variables/Variable.cs | 6 +++--- .../Project/Src/Variables/VariableCollection.cs | 11 +++++++++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ClassVariable.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ClassVariable.cs index 80498f04c9..8a9e248ec4 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ClassVariable.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ClassVariable.cs @@ -11,8 +11,8 @@ namespace Debugger { public class ClassVariable: Variable { - bool isStatic; - bool isPublic; + internal bool isStatic; + internal bool isPublic; public bool IsStatic { get { diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs index 3e939682d9..f8a30f20b7 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs @@ -23,8 +23,8 @@ namespace Debugger string name; VariableCollection subVariables; - protected ValueGetter valueGetter; - Value cachedValue; + internal protected ValueGetter valueGetter; + internal Value cachedValue; event EventHandler valueChanged; public event EventHandler ValueRemovedFromCollection; @@ -89,7 +89,7 @@ namespace Debugger } } - protected virtual void OnValueChanged() + protected internal virtual void OnValueChanged() { cachedValue = null; if (valueChanged != null) { diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/VariableCollection.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/VariableCollection.cs index 07f1b6694f..bdd917577c 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/VariableCollection.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/VariableCollection.cs @@ -144,6 +144,17 @@ namespace Debugger foreach(Variable newVariable in newVariables) { if (this.Contains(newVariable.Name)) { + Variable oldVariable = this[newVariable.Name]; + // HACK: Realy bad object-oriented design!!! + // Trasfer the new variable into the old one + if (oldVariable != newVariable) { + oldVariable.valueGetter = newVariable.valueGetter; + oldVariable.cachedValue = null; + if (newVariable is ClassVariable && oldVariable is ClassVariable) { + ((ClassVariable)oldVariable).isPublic = ((ClassVariable)oldVariable).isPublic; + ((ClassVariable)oldVariable).isStatic = ((ClassVariable)oldVariable).isStatic; + } + } // Keep the variable in the list toBeRemoved.Remove(this[newVariable.Name]); } else { From 9add2ad9bb1b50e15934c2df1bf6ead6cd37a973 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 3 May 2006 16:11:00 +0000 Subject: [PATCH 47/49] SD2-799 - Updating web references resets the namespace. The namespace is now stored inside the MSBuild WebReferenceUrl element. Modified SharpQuery's OLE DB COM reference to use the new format so the interop assembly can be located for code completion. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1385 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/AddIns/Misc/SharpQuery/SharpQuery.csproj | 16 ++++++------- .../Dialogs/ReferenceDialog/WebReference.cs | 1 + .../Commands/ReferenceFolderNodeCommands.cs | 2 +- .../Project/Src/Project/WebReferenceUrl.cs | 14 +++++++++++ .../WebReferenceProjectItemsTest.cs | 6 +++++ .../WebReferences/WebReferenceUrlTests.cs | 24 ++++++++++++++++++- 6 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/AddIns/Misc/SharpQuery/SharpQuery.csproj b/src/AddIns/Misc/SharpQuery/SharpQuery.csproj index 4b1e5934d1..480847d7f8 100644 --- a/src/AddIns/Misc/SharpQuery/SharpQuery.csproj +++ b/src/AddIns/Misc/SharpQuery/SharpQuery.csproj @@ -77,14 +77,6 @@ - - {2206CEB0-19C1-11D1-89E0-00C04FD7A829} - 1 - 0 - 0 - tlbimp - False - {2748AD25-9C63-4E12-877B-4DCE96FBED54} ICSharpCode.SharpDevelop @@ -96,6 +88,14 @@ False + + {2206CEB0-19C1-11D1-89E0-00C04FD7A829} + 1 + 0 + 0 + tlbimp + False + diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/WebReference.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/WebReference.cs index 188b3cc25f..d63ecc6d0f 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/WebReference.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/WebReference.cs @@ -372,6 +372,7 @@ namespace ICSharpCode.SharpDevelop.Gui webReferenceUrl.Include = url; webReferenceUrl.UpdateFromURL = url; webReferenceUrl.RelPath = relativePath; + webReferenceUrl.Namespace = proxyNamespace; items.Add(webReferenceUrl); // References. diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs index 3be027fce2..7d6f41aeb7 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ReferenceFolderNodeCommands.cs @@ -56,7 +56,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands DiscoveryClientProtocol protocol = DiscoverWebServices(url.UpdateFromURL); if (protocol != null) { // Save web services. - WebReference webReference = new WebReference(url.Project, url.UpdateFromURL, node.Text, url.Project.RootNamespace, protocol); + WebReference webReference = new WebReference(url.Project, url.UpdateFromURL, node.Text, url.Namespace, protocol); webReference.Save(); // Update project. diff --git a/src/Main/Base/Project/Src/Project/WebReferenceUrl.cs b/src/Main/Base/Project/Src/Project/WebReferenceUrl.cs index 1d9058aad6..a215960daf 100644 --- a/src/Main/Base/Project/Src/Project/WebReferenceUrl.cs +++ b/src/Main/Base/Project/Src/Project/WebReferenceUrl.cs @@ -98,6 +98,20 @@ namespace ICSharpCode.SharpDevelop.Project } } + [Browsable(false)] + public string Namespace { + get { + string ns = base.Properties["Namespace"]; + if (ns.Length > 0) { + return ns; + } + return Project.RootNamespace; + } + set { + base.Properties["Namespace"] = value; + } + } + public override string FileName { get { if (Project != null && RelPath != null) { diff --git a/src/Main/Base/Test/WebReferences/WebReferenceProjectItemsTest.cs b/src/Main/Base/Test/WebReferences/WebReferenceProjectItemsTest.cs index 9dfe90318e..0454da1eb9 100644 --- a/src/Main/Base/Test/WebReferences/WebReferenceProjectItemsTest.cs +++ b/src/Main/Base/Test/WebReferences/WebReferenceProjectItemsTest.cs @@ -110,6 +110,12 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences Assert.AreEqual("Static", webReferenceUrl.UrlBehavior); } + [Test] + public void WebReferenceUrlNamespace() + { + Assert.AreEqual(proxyNamespace, webReferenceUrl.Namespace); + } + [Test] public void WebReferenceRelPath() { diff --git a/src/Main/Base/Test/WebReferences/WebReferenceUrlTests.cs b/src/Main/Base/Test/WebReferences/WebReferenceUrlTests.cs index d63ece8171..75e5bbaf2c 100644 --- a/src/Main/Base/Test/WebReferences/WebReferenceUrlTests.cs +++ b/src/Main/Base/Test/WebReferences/WebReferenceUrlTests.cs @@ -54,6 +54,28 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences Assert.AreEqual("http://localhost/test.asmx", url.Include); Assert.AreEqual("Web References\\mywebservice", url.RelPath); } - + + [Test] + public void NoNamespaceSpecified() + { + MSBuildProject project = new MSBuildProject(); + project.FileName = "c:\\projects\\test\\foo.csproj"; + project.RootNamespace = "TestRootNamespace"; + WebReferenceUrl url = new WebReferenceUrl(project); + + Assert.AreEqual("TestRootNamespace", url.Namespace); + } + + [Test] + public void NamespaceSpecified() + { + MSBuildProject project = new MSBuildProject(); + project.FileName = "c:\\projects\\test\\foo.csproj"; + project.RootNamespace = "TestRootNamespace"; + WebReferenceUrl url = new WebReferenceUrl(project); + url.Namespace = "WebReferenceNamespace"; + + Assert.AreEqual("WebReferenceNamespace", url.Namespace); + } } } From f2ecb18965c9b23f2ad87975dd459b972881b60a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 4 May 2006 18:00:32 +0000 Subject: [PATCH 48/49] Fixed BOO-713: Explode operator must be used for DataGridView.Columns.AddRange. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1386 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Designer/BooDesignerGenerator.cs | 72 +++++++++++++++++++ .../Project/Src/Designer/BooDesignerLoader.cs | 6 +- .../AbstractDesignerGenerator.cs | 6 ++ 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs index 80a6609f70..126b1f1bac 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs @@ -7,6 +7,7 @@ using System; using System.ComponentModel; +using System.Collections.Generic; using System.Text; using System.Reflection; using System.CodeDom; @@ -30,6 +31,77 @@ namespace Grunwald.BooBinding.Designer return new Boo.Lang.CodeDom.BooCodeProvider(); } + protected override void FixGeneratedCode(IClass formClass, CodeMemberMethod code) + { + base.FixGeneratedCode(formClass, code); + Dictionary variables = new Dictionary(); + foreach (IField f in formClass.DefaultReturnType.GetFields()) { + variables[f.Name] = f.ReturnType; + } + variables[""] = formClass.DefaultReturnType; + foreach (CodeStatement statement in code.Statements) { + CodeExpressionStatement ces = statement as CodeExpressionStatement; + if (ces != null) { + CodeMethodInvokeExpression cmie = ces.Expression as CodeMethodInvokeExpression; + if (cmie != null && cmie.Parameters.Count == 1) { + CodeArrayCreateExpression cace = cmie.Parameters[0] as CodeArrayCreateExpression; + if (cace != null) { + IReturnType rt = ResolveType(cmie.Method.TargetObject, variables); + if (rt != null) { + foreach (IMethod m in rt.GetMethods()) { + if (m.Name == cmie.Method.MethodName + && m.Parameters.Count == 1 + && m.Parameters[0].IsParams + && m.Parameters[0].ReturnType.ArrayDimensions == 1 + && m.Parameters[0].ReturnType.ArrayElementType.FullyQualifiedName == cace.CreateType.BaseType) + { + cace.UserData["Explode"] = true; + } + } + } + } + } + } + CodeVariableDeclarationStatement cvds = statement as CodeVariableDeclarationStatement; + if (cvds != null) { + variables[cvds.Name] = new SearchClassReturnType(formClass.ProjectContent, formClass, formClass.Region.BeginLine + 1, 0, cvds.Type.BaseType, cvds.Type.TypeArguments.Count); + } + } + } + + IReturnType ResolveType(CodeExpression expr, Dictionary variables) + { + IReturnType rt; + if (expr is CodeThisReferenceExpression) { + return variables[""]; + } else if (expr is CodeVariableReferenceExpression) { + string name = (expr as CodeVariableReferenceExpression).VariableName; + if (variables.TryGetValue(name, out rt)) + return rt; + } else if (expr is CodeFieldReferenceExpression) { + string name = (expr as CodeFieldReferenceExpression).FieldName; + rt = ResolveType((expr as CodeFieldReferenceExpression).TargetObject, variables); + if (rt != null) { + foreach (IField f in rt.GetFields()) { + if (f.Name == name) { + return f.ReturnType; + } + } + } + } else if (expr is CodePropertyReferenceExpression) { + string name = (expr as CodePropertyReferenceExpression).PropertyName; + rt = ResolveType((expr as CodePropertyReferenceExpression).TargetObject, variables); + if (rt != null) { + foreach (IProperty p in rt.GetProperties()) { + if (p.Name == name) { + return p.ReturnType; + } + } + } + } + return null; + } + protected override string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body, string indentation) { if (string.IsNullOrEmpty(body)) body = "pass"; diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs index 9e1bc951f6..ea0427a36a 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerLoader.cs @@ -198,7 +198,11 @@ namespace Grunwald.BooBinding.Designer protected override void Write(CodeCompileUnit unit) { LoggingService.Info("BooDesignerLoader.Write called"); - generator.MergeFormChanges(unit); + try { + generator.MergeFormChanges(unit); + } catch (Exception ex) { + MessageService.ShowError(ex); + } } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs index d601be63e4..11d2816bd5 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs @@ -130,6 +130,10 @@ namespace ICSharpCode.FormsDesigner protected abstract DomRegion GetReplaceRegion(ICSharpCode.TextEditor.Document.IDocument document, IMethod method); + protected virtual void FixGeneratedCode(IClass formClass, CodeMemberMethod code) + { + } + public void MergeFormChanges(CodeCompileUnit unit) { Reparse(); @@ -163,6 +167,8 @@ namespace ICSharpCode.FormsDesigner Reparse(); } + FixGeneratedCode(this.formClass, initializeComponent); + // generate file and get initialize components string StringWriter writer = new StringWriter(); CodeDOMGenerator domGenerator = new CodeDOMGenerator(this.CodeDomProvider, tabs + '\t'); From e8c9d5e35cfdc1aaa133d0e6b2f744ce3b8cdab8 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 5 May 2006 15:56:39 +0000 Subject: [PATCH 49/49] RefactoringService now accepts any ResolveResult. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1387 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/ConvertVisitorExpressions.cs | 8 +++-- .../Project/NRefactoryToBooConverter.csproj | 10 +++++-- .../Test/MemberTests.cs | 30 +++++++++++++++++++ .../Test/TestHelper.cs | 5 ++++ .../RefactoringService/RefactoringService.cs | 26 ++++++++++++++++ 5 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorExpressions.cs b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorExpressions.cs index 2d72123800..5a3f73f267 100644 --- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorExpressions.cs +++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorExpressions.cs @@ -117,6 +117,10 @@ namespace NRefactoryToBooConverter if (val is double) { return new B.DoubleLiteralExpression(GetLexicalInfo(pe), (double)val, false); } + if (val is decimal) { + AddWarning(pe, "Converting decimal literal to double literal"); + return new B.DoubleLiteralExpression(GetLexicalInfo(pe), (double)(decimal)val); + } AddError(pe, "Unknown primitive literal of type " + val.GetType().FullName); return null; } @@ -520,14 +524,14 @@ namespace NRefactoryToBooConverter { AddError(checkedExpression, "Using 'checked' inside an expression is not supported by boo, " + "use the checked {} block instead."); - return null; + return MakeMethodCall("checked", ConvertExpression(checkedExpression.Expression)); } public object Visit(UncheckedExpression uncheckedExpression, object data) { AddError(uncheckedExpression, "Using 'unchecked' inside an expression is not supported by boo, " + "use the unchecked {} block instead."); - return null; + return MakeMethodCall("unchecked", ConvertExpression(uncheckedExpression.Expression)); } } } diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/NRefactoryToBooConverter.csproj b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/NRefactoryToBooConverter.csproj index 4233cf143d..0e17b41a95 100644 --- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/NRefactoryToBooConverter.csproj +++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/NRefactoryToBooConverter.csproj @@ -9,7 +9,6 @@ False False False - None False Auto 105906176 @@ -17,7 +16,6 @@ 4096 4 false - false bin\Debug\ @@ -29,6 +27,14 @@ true TRACE + + Full + true + + + None + false + diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/MemberTests.cs b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/MemberTests.cs index 3d1106486c..30d8e0834e 100644 --- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/MemberTests.cs +++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/MemberTests.cs @@ -134,6 +134,18 @@ namespace NRefactoryToBooConverter.Tests TestInClass("public static void Run() {}", "public static def Run() as System.Void:\n\tpass"); } + [Test] + public void AbstractMethod() + { + TestInClass("public abstract void Run();", "public abstract def Run() as System.Void:\n\tpass"); + } + + [Test] + public void AbstractMethodInInterface() + { + TestInInterface("void Run();", "def Run() as System.Void"); + } + [Test] public void StaticMethodInStaticClass() { @@ -214,6 +226,18 @@ namespace NRefactoryToBooConverter.Tests "[AA]\npublic Text as System.String:\n\t[BB]\n\tget:\n\t\tpass\n\t[CC]\n\tset:\n\t\tpass"); } + [Test] + public void AbstractProperty() + { + TestInClass("public abstract string Prop { get; }", "public abstract Prop as System.String:\n\tget:\n\t\tpass"); + } + + [Test] + public void AbstractPropertyInInterface() + { + TestInInterface("string Prop { get; }", "Prop as System.String:\n\tget"); + } + [Test] public void ReadOnlyIndexer() { @@ -251,6 +275,12 @@ namespace NRefactoryToBooConverter.Tests TestInClass("[LookHere] event EventHandler Closed;", "[LookHere]\nprivate event Closed as EventHandler"); } + [Test] + public void EventInInterface() + { + TestInInterface("event EventHandler Closed;", "event Closed as EventHandler"); + } + [Test] public void PInvoke() { diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/TestHelper.cs b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/TestHelper.cs index 652bd915ab..3835c0c4a3 100644 --- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/TestHelper.cs +++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/TestHelper.cs @@ -65,6 +65,11 @@ namespace NRefactoryToBooConverter.Tests Assert.AreEqual(output.Replace("??", ConverterSettings.DefaultNameGenerationPrefix), ConvertVB(input)); } + protected void TestInInterface(string input, string output) + { + Test("public interface ClassName {\n" + input + "\n}", "public interface ClassName:\n\t" + output.Replace("\n", "\n\t")); + } + protected void TestInClass(string input, string output) { Test("public class ClassName {\n" + input + "\n}", "public class ClassName:\n\t" + output.Replace("\n", "\n\t")); diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs index 9392dc5e26..f36310962f 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs @@ -86,9 +86,35 @@ namespace ICSharpCode.SharpDevelop.Refactoring ///

public static List FindReferences(IClass @class, IProgressMonitor progressMonitor) { + if (@class == null) + throw new ArgumentNullException("class"); return RunFindReferences(@class, null, false, progressMonitor); } + /// + /// Find all references to the resolved entity. + /// + public static List FindReferences(ResolveResult entity, IProgressMonitor progressMonitor) + { + if (entity == null) + throw new ArgumentNullException("entity"); + if (entity is LocalResolveResult) { + return RunFindReferences(entity.CallingClass, (entity as LocalResolveResult).Field, true, progressMonitor); + } else if (entity is TypeResolveResult) { + return FindReferences((entity as TypeResolveResult).ResolvedClass, progressMonitor); + } else if (entity is MemberResolveResult) { + return FindReferences((entity as MemberResolveResult).ResolvedMember, progressMonitor); + } else if (entity is MethodResolveResult) { + IMethod method = (entity as MethodResolveResult).GetMethodIfSingleOverload(); + if (method != null) { + return FindReferences(method, progressMonitor); + } + } else if (entity is MixedResolveResult) { + return FindReferences((entity as MixedResolveResult).PrimaryResult, progressMonitor); + } + return null; + } + /// /// Find all references to the specified local variable. ///