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();