diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/ICSharpCode.Reporting.csproj b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/ICSharpCode.Reporting.csproj index 4bfa305c23..d6c887b9a9 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/ICSharpCode.Reporting.csproj +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/ICSharpCode.Reporting.csproj @@ -115,6 +115,7 @@ + diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionHelper.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionHelper.cs index ece3f53614..252ec679d6 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionHelper.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/ExpressionHelper.cs @@ -3,6 +3,7 @@ using System; using System.Globalization; using ICSharpCode.Reporting.Globals; +using Irony.Interpreter.Ast; namespace ICSharpCode.Reporting.Expressions { @@ -26,5 +27,9 @@ namespace ICSharpCode.Reporting.Expressions } return false; } + + public static string ComposeAstNodeError (string branch,AstNode node) { + return String.Format ("Missing {0} <{1}>",branch,node.AsString); + } } } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/FieldsNode.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/FieldsNode.cs index 27369a45e4..40e6c22ad9 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/FieldsNode.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/FieldsNode.cs @@ -30,6 +30,9 @@ namespace ICSharpCode.Reporting.Expressions.Irony.Ast thread.CurrentNode = this; //standard prolog var container = thread.GetCurrentContainer(); var column = (ExportText)container.ExportedItems.Where(x => x.Name == fieldNode.AsString).FirstOrDefault(); + if (column == null) { + return ExpressionHelper.ComposeAstNodeError("Fields",fieldNode); + } return column.Text; } } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/GlobalsNode.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/GlobalsNode.cs new file mode 100644 index 0000000000..8300d0137b --- /dev/null +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/GlobalsNode.cs @@ -0,0 +1,30 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) +using System; +using System.Linq; +using ICSharpCode.Reporting.PageBuilder.ExportColumns; +using Irony.Ast; +using Irony.Interpreter; +using Irony.Interpreter.Ast; +using Irony.Parsing; + +namespace ICSharpCode.Reporting.Expressions.Irony.Ast +{ + /// + /// Description of GlobalsNode. + /// + public class GlobalsNode: AstNode + { + AstNode globalNode; + + public override void Init(AstContext context, ParseTreeNode treeNode) + { + base.Init(context, treeNode); + } + + public override void DoSetValue(ScriptThread thread, object value) + { + base.DoSetValue(thread, value); + } + } +} diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/ParametersCallNode.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/ParametersCallNode.cs index f9ae4a06d9..cb9b2fda3c 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/ParametersCallNode.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/Ast/ParametersCallNode.cs @@ -30,6 +30,9 @@ namespace ICSharpCode.Reporting.Expressions.Irony.Ast thread.CurrentNode = this; //standard prolog var parametersCollection = thread.GetParametersCollection(); result = parametersCollection.Find(parameterNode.AsString); + if (result == null) +// return String.Format("Missing Parameter <{0}>",parameterNode.AsString); + return ExpressionHelper.ComposeAstNodeError("Parameters",parameterNode); return result.ParameterValue; } } diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/ReportingLanguageGrammer.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/ReportingLanguageGrammer.cs index 74f18c13a9..be88186717 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/ReportingLanguageGrammer.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Src/Expressions/Irony/ReportingLanguageGrammer.cs @@ -15,6 +15,7 @@ namespace ICSharpCode.Reporting.Expressions.Irony /// public class ReportingLanguageGrammer:InterpretedLanguageGrammar { + private const string exclamationMark = "!"; public ReportingLanguageGrammer() :base(caseSensitive : false) { this.GrammarComments = @@ -56,6 +57,7 @@ bool operations &,&&, |, ||; ternary '?:' operator." ; // SharpReporting var ParametersSection = new NonTerminal("ParametersCall",typeof(ParametersCallNode)); var FieldsSection = new NonTerminal("FieldsCall",typeof(FieldsNode)); + var GlobalSection = new NonTerminal("GlobalSection",typeof(GlobalsNode)); // end of SharpReporting @@ -77,6 +79,7 @@ bool operations &,&&, |, ||; ternary '?:' operator." ; // 3. BNF rules Expr.Rule = Term | UnExpr | BinExpr | PrefixIncDec | PostfixIncDec | TernaryIfExpr | ParametersSection +// | GlobalSection | FieldsSection; Term.Rule = number | ParExpr | stringLit | FunctionCall | identifier | MemberAccess | IndexedAccess; @@ -96,11 +99,18 @@ bool operations &,&&, |, ||; ternary '?:' operator." ; ArgList.Rule = MakeStarRule(ArgList, comma, Expr); FunctionCall.Rule = Expr + PreferShiftHere() + "(" + ArgList + ")"; - // SharpReporting - - ParametersSection.Rule = ToTerm("Parameters") + "!" + identifier; - FieldsSection.Rule = ToTerm("Fields") + "!" + identifier; + // SharpReporting + + ParametersSection.Rule = ToTerm("Parameters") + exclamationMark + identifier; + FieldsSection.Rule = ToTerm("Fields") + exclamationMark + identifier; + /* + GlobalSection.Rule = GlobalSection + exclamationMark + Symbol("PageNumber") + | GlobalSection + exclamationMark + Symbol("TotalPages") + | GlobalSection + exclamationMark + Symbol("ExecutionTime") + | GlobalSection + exclamationMark + Symbol("ReportFolder") + | GlobalSection + exclamationMark + Symbol("ReportName"); + */ // end of SharpReporting FunctionCall.NodeCaptionTemplate = "call #{0}(...)"; diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/InterationTests/FieldsFixture.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/InterationTests/FieldsFixture.cs index 0fe065a59c..47244f7907 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/InterationTests/FieldsFixture.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/InterationTests/FieldsFixture.cs @@ -40,6 +40,25 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests } + [Test] + public void FieldNotExist() { + var script = "=Fields!myfieldNotExist"; + collection[0].Text = script; + collection.Add(new ExportText() + { + Text = "Sharpdevelop", + Name = "myfield1" + }); + var visitor = new ExpressionVisitor(new ReportSettings()); + var exportContainer = new ExportContainer(); + exportContainer.ExportedItems.Add(collection[0]); + exportContainer.ExportedItems.Add(collection[1]); + visitor.Visit(exportContainer); + Assert.That (collection[0].Text.StartsWith("Missing")); + Assert.That (collection[0].Text.Contains("myfieldNotExist")); + } + + [SetUp] public void CreateExportlist() { collection = new Collection(); diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/InterationTests/ParametersFixture.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/InterationTests/ParametersFixture.cs index 24872ca575..fe6c402fff 100644 --- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/InterationTests/ParametersFixture.cs +++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting/Test/ICSharpCode.Reporting.Test/src/Expressions/InterationTests/ParametersFixture.cs @@ -48,6 +48,25 @@ namespace ICSharpCode.Reporting.Test.Expressions.InterationTests } + [Test] + public void ParameterNotExist() { + var parameters = new ParameterCollection(); + parameters.Add(new BasicParameter() { + ParameterName = "param1", + ParameterValue = "SharpDevelop" + } + ); + var reportSettings = CreateReportSettings(parameters); + var visitor = new ExpressionVisitor(reportSettings); + + var script = "=Parameters!paramNotExist"; + collection[0].Text = script; + visitor.Visit(collection[0]); + Assert.That (collection[0].Text.StartsWith("Missing")); + Assert.That (collection[0].Text.Contains("paramNotExist")); + } + + ReportSettings CreateReportSettings(ParameterCollection parameters) { var reportSettings = new ReportSettings();