Forráskód Böngészése

DoWhileStatement syntax fixed.

au@andreasunger.net 14 éve
szülő
commit
a3d39784b6
37 módosított fájl, 2674 hozzáadás és 2336 törlés
  1. 1 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/MscriptParser.java
  2. 49 16
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g
  3. 44 44
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscriptLexer.java
  4. 2130 2042
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscriptParser.java
  5. 1 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/Mscript.xtext
  6. 8 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/VariableAccess.java
  7. 2 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/AstPackageImpl.java
  8. 25 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/VariableAccessImpl.java
  9. 4 4
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/EquationPart.java
  10. 30 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/FunctionModelPackage.java
  11. 2 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/VariableDescriptor.java
  12. 27 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/VariableStep.java
  13. 78 43
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/construct/FunctionDescriptorConstructor.java
  14. 2 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/construct/IFunctionDescriptorConstructor.java
  15. 3 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/EquationDescriptorImpl.java
  16. 9 9
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/EquationPartImpl.java
  17. 1 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/FunctionDescriptorImpl.java
  18. 14 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/FunctionModelPackageImpl.java
  19. 2 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/VariableDescriptorImpl.java
  20. 54 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/VariableStepImpl.java
  21. 15 12
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/ExpressionTransformer.java
  22. 3 2
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/FunctionDefinitionTransformer.java
  23. 3 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/FunctionDefinitionTransformerContext.java
  24. 2 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/IFunctionDefinitionTransformer.java
  25. 3 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/ITransformerContext.java
  26. 17 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/TransformerContext.java
  27. 4 4
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/internal/functionmodel/util/FunctionModelUtil.java
  28. 0 45
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/internal/functionmodel/util/StepExpressionResult.java
  29. 6 4
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/internal/functionmodel/util/VariableDescriptorWrapper.java
  30. 2 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/internal/il/transform/AssertionEvaluator.java
  31. 9 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/interpreter/IStaticEvaluationContext.java
  32. 39 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/interpreter/StaticEvaluationContext.java
  33. 33 1
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/interpreter/StaticFunctionEvaluator.java
  34. 27 33
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/internal/functionmodel/util/StepExpressionHelper.java
  35. 10 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/interpreter/builtin/RoundFunction.java
  36. 14 0
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/util/SyntaxStatus.java
  37. 1 62
      org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/validation/MscriptJavaValidator.java

+ 1 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/MscriptParser.java

@@ -376,7 +376,7 @@ public class MscriptParser extends AbstractContentAssistParser {
 					put(grammarAccess.getForStatementAccess().getCollectionExpressionAssignment_4(), "rule__ForStatement__CollectionExpressionAssignment_4");
 					put(grammarAccess.getForStatementAccess().getBodyAssignment_6(), "rule__ForStatement__BodyAssignment_6");
 					put(grammarAccess.getDoWhileStatementAccess().getBodyAssignment_1(), "rule__DoWhileStatement__BodyAssignment_1");
-					put(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_3(), "rule__DoWhileStatement__ConditionAssignment_3");
+					put(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_4(), "rule__DoWhileStatement__ConditionAssignment_4");
 					put(grammarAccess.getReturnStatementAccess().getExpressionAssignment_1(), "rule__ReturnStatement__ExpressionAssignment_1");
 					put(grammarAccess.getUnitAccess().getNumeratorAssignment_1_1_1(), "rule__Unit__NumeratorAssignment_1_1_1");
 					put(grammarAccess.getUnitAccess().getDenominatorAssignment_1_1_2_1(), "rule__Unit__DenominatorAssignment_1_1_2_1");

+ 49 - 16
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g

@@ -16320,11 +16320,11 @@ rule__DoWhileStatement__Group__2__Impl
     }
 :
 (
-{ before(grammarAccess.getDoWhileStatementAccess().getLeftParenthesisKeyword_2()); }
+{ before(grammarAccess.getDoWhileStatementAccess().getWhileKeyword_2()); }
 
-	'(' 
+	'while' 
 
-{ after(grammarAccess.getDoWhileStatementAccess().getLeftParenthesisKeyword_2()); }
+{ after(grammarAccess.getDoWhileStatementAccess().getWhileKeyword_2()); }
 )
 
 ;
@@ -16351,9 +16351,11 @@ rule__DoWhileStatement__Group__3__Impl
     }
 :
 (
-{ before(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_3()); }
-(rule__DoWhileStatement__ConditionAssignment_3)
-{ after(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_3()); }
+{ before(grammarAccess.getDoWhileStatementAccess().getLeftParenthesisKeyword_3()); }
+
+	'(' 
+
+{ after(grammarAccess.getDoWhileStatementAccess().getLeftParenthesisKeyword_3()); }
 )
 
 ;
@@ -16380,11 +16382,9 @@ rule__DoWhileStatement__Group__4__Impl
     }
 :
 (
-{ before(grammarAccess.getDoWhileStatementAccess().getRightParenthesisKeyword_4()); }
-
-	')' 
-
-{ after(grammarAccess.getDoWhileStatementAccess().getRightParenthesisKeyword_4()); }
+{ before(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_4()); }
+(rule__DoWhileStatement__ConditionAssignment_4)
+{ after(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_4()); }
 )
 
 ;
@@ -16399,6 +16399,7 @@ rule__DoWhileStatement__Group__5
     }
 :
 	rule__DoWhileStatement__Group__5__Impl
+	rule__DoWhileStatement__Group__6
 ;
 finally {
 	restoreStackSize(stackSize);
@@ -16410,11 +16411,41 @@ rule__DoWhileStatement__Group__5__Impl
     }
 :
 (
-{ before(grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_5()); }
+{ before(grammarAccess.getDoWhileStatementAccess().getRightParenthesisKeyword_5()); }
+
+	')' 
+
+{ after(grammarAccess.getDoWhileStatementAccess().getRightParenthesisKeyword_5()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DoWhileStatement__Group__6
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__DoWhileStatement__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__Group__6__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_6()); }
 
 	';' 
 
-{ after(grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_5()); }
+{ after(grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_6()); }
 )
 
 ;
@@ -16435,6 +16466,8 @@ finally {
 
 
 
+
+
 rule__ContinueStatement__Group__0
     @init {
 		int stackSize = keepStackSize();
@@ -20424,14 +20457,14 @@ finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DoWhileStatement__ConditionAssignment_3
+rule__DoWhileStatement__ConditionAssignment_4
     @init {
 		int stackSize = keepStackSize();
     }
 :
 (
-{ before(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_3_0()); }
-	ruleExpression{ after(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_3_0()); }
+{ before(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_4_0()); }
+	ruleExpression{ after(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_4_0()); }
 )
 
 ;

+ 44 - 44
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscriptLexer.java

@@ -1714,8 +1714,8 @@ public class InternalMscriptLexer extends Lexer {
         try {
             int _type = RULE_N;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20638:8: ( 'n' )
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20638:10: 'n'
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20671:8: ( 'n' )
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20671:10: 'n'
             {
             match('n'); 
 
@@ -1734,8 +1734,8 @@ public class InternalMscriptLexer extends Lexer {
         try {
             int _type = RULE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20640:9: ( ( '_' | 'a' .. 'z' | 'A' .. 'Z' ) ( '0' .. '9' | '_' | 'a' .. 'z' | 'A' .. 'Z' )* )
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20640:11: ( '_' | 'a' .. 'z' | 'A' .. 'Z' ) ( '0' .. '9' | '_' | 'a' .. 'z' | 'A' .. 'Z' )*
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20673:9: ( ( '_' | 'a' .. 'z' | 'A' .. 'Z' ) ( '0' .. '9' | '_' | 'a' .. 'z' | 'A' .. 'Z' )* )
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20673:11: ( '_' | 'a' .. 'z' | 'A' .. 'Z' ) ( '0' .. '9' | '_' | 'a' .. 'z' | 'A' .. 'Z' )*
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -1746,7 +1746,7 @@ public class InternalMscriptLexer extends Lexer {
                 recover(mse);
                 throw mse;}
 
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20640:35: ( '0' .. '9' | '_' | 'a' .. 'z' | 'A' .. 'Z' )*
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20673:35: ( '0' .. '9' | '_' | 'a' .. 'z' | 'A' .. 'Z' )*
             loop1:
             do {
                 int alt1=2;
@@ -1795,11 +1795,11 @@ public class InternalMscriptLexer extends Lexer {
         try {
             int _type = RULE_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20642:13: ( '\"' (~ ( ( '\\\\' | '\"' ) ) | '\\\\' ( '\\'' | '\"' | '?' | '\\\\' | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' ) )* '\"' )
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20642:15: '\"' (~ ( ( '\\\\' | '\"' ) ) | '\\\\' ( '\\'' | '\"' | '?' | '\\\\' | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' ) )* '\"'
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20675:13: ( '\"' (~ ( ( '\\\\' | '\"' ) ) | '\\\\' ( '\\'' | '\"' | '?' | '\\\\' | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' ) )* '\"' )
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20675:15: '\"' (~ ( ( '\\\\' | '\"' ) ) | '\\\\' ( '\\'' | '\"' | '?' | '\\\\' | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' ) )* '\"'
             {
             match('\"'); 
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20642:19: (~ ( ( '\\\\' | '\"' ) ) | '\\\\' ( '\\'' | '\"' | '?' | '\\\\' | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' ) )*
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20675:19: (~ ( ( '\\\\' | '\"' ) ) | '\\\\' ( '\\'' | '\"' | '?' | '\\\\' | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' ) )*
             loop2:
             do {
                 int alt2=3;
@@ -1815,7 +1815,7 @@ public class InternalMscriptLexer extends Lexer {
 
                 switch (alt2) {
             	case 1 :
-            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20642:20: ~ ( ( '\\\\' | '\"' ) )
+            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20675:20: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -1830,7 +1830,7 @@ public class InternalMscriptLexer extends Lexer {
             	    }
             	    break;
             	case 2 :
-            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20642:34: '\\\\' ( '\\'' | '\"' | '?' | '\\\\' | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' )
+            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20675:34: '\\\\' ( '\\'' | '\"' | '?' | '\\\\' | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' )
             	    {
             	    match('\\'); 
             	    if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='?'||input.LA(1)=='\\'||(input.LA(1)>='a' && input.LA(1)<='b')||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||input.LA(1)=='t'||input.LA(1)=='v' ) {
@@ -1868,8 +1868,8 @@ public class InternalMscriptLexer extends Lexer {
         try {
             int _type = RULE_ONE;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20644:10: ( '1' )
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20644:12: '1'
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20677:10: ( '1' )
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20677:12: '1'
             {
             match('1'); 
 
@@ -1888,10 +1888,10 @@ public class InternalMscriptLexer extends Lexer {
         try {
             int _type = RULE_REAL;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:11: ( ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ )? )
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:13: ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ )?
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:11: ( ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ )? )
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:13: ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ )?
             {
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:13: ( '0' .. '9' )+
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:13: ( '0' .. '9' )+
             int cnt3=0;
             loop3:
             do {
@@ -1905,7 +1905,7 @@ public class InternalMscriptLexer extends Lexer {
 
                 switch (alt3) {
             	case 1 :
-            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:14: '0' .. '9'
+            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:14: '0' .. '9'
             	    {
             	    matchRange('0','9'); 
 
@@ -1922,7 +1922,7 @@ public class InternalMscriptLexer extends Lexer {
             } while (true);
 
             match('.'); 
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:29: ( '0' .. '9' )*
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:29: ( '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -1935,7 +1935,7 @@ public class InternalMscriptLexer extends Lexer {
 
                 switch (alt4) {
             	case 1 :
-            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:30: '0' .. '9'
+            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:30: '0' .. '9'
             	    {
             	    matchRange('0','9'); 
 
@@ -1947,7 +1947,7 @@ public class InternalMscriptLexer extends Lexer {
                 }
             } while (true);
 
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:41: ( ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ )?
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:41: ( ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -1956,7 +1956,7 @@ public class InternalMscriptLexer extends Lexer {
             }
             switch (alt7) {
                 case 1 :
-                    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:42: ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+
+                    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:42: ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+
                     {
                     if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
                         input.consume();
@@ -1967,7 +1967,7 @@ public class InternalMscriptLexer extends Lexer {
                         recover(mse);
                         throw mse;}
 
-                    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:52: ( '+' | '-' )?
+                    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:52: ( '+' | '-' )?
                     int alt5=2;
                     int LA5_0 = input.LA(1);
 
@@ -1993,7 +1993,7 @@ public class InternalMscriptLexer extends Lexer {
 
                     }
 
-                    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:63: ( '0' .. '9' )+
+                    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:63: ( '0' .. '9' )+
                     int cnt6=0;
                     loop6:
                     do {
@@ -2007,7 +2007,7 @@ public class InternalMscriptLexer extends Lexer {
 
                         switch (alt6) {
                     	case 1 :
-                    	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20646:64: '0' .. '9'
+                    	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20679:64: '0' .. '9'
                     	    {
                     	    matchRange('0','9'); 
 
@@ -2045,10 +2045,10 @@ public class InternalMscriptLexer extends Lexer {
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20648:10: ( ( '0' .. '9' )+ )
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20648:12: ( '0' .. '9' )+
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20681:10: ( ( '0' .. '9' )+ )
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20681:12: ( '0' .. '9' )+
             {
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20648:12: ( '0' .. '9' )+
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20681:12: ( '0' .. '9' )+
             int cnt8=0;
             loop8:
             do {
@@ -2062,7 +2062,7 @@ public class InternalMscriptLexer extends Lexer {
 
                 switch (alt8) {
             	case 1 :
-            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20648:13: '0' .. '9'
+            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20681:13: '0' .. '9'
             	    {
             	    matchRange('0','9'); 
 
@@ -2094,12 +2094,12 @@ public class InternalMscriptLexer extends Lexer {
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20650:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20650:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20683:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20683:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); 
 
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20650:24: ( options {greedy=false; } : . )*
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20683:24: ( options {greedy=false; } : . )*
             loop9:
             do {
                 int alt9=2;
@@ -2124,7 +2124,7 @@ public class InternalMscriptLexer extends Lexer {
 
                 switch (alt9) {
             	case 1 :
-            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20650:52: .
+            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20683:52: .
             	    {
             	    matchAny(); 
 
@@ -2154,12 +2154,12 @@ public class InternalMscriptLexer extends Lexer {
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20652:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20652:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20685:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20685:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("//"); 
 
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20652:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20685:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop10:
             do {
                 int alt10=2;
@@ -2172,7 +2172,7 @@ public class InternalMscriptLexer extends Lexer {
 
                 switch (alt10) {
             	case 1 :
-            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20652:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20685:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2192,7 +2192,7 @@ public class InternalMscriptLexer extends Lexer {
                 }
             } while (true);
 
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20652:40: ( ( '\\r' )? '\\n' )?
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20685:40: ( ( '\\r' )? '\\n' )?
             int alt12=2;
             int LA12_0 = input.LA(1);
 
@@ -2201,9 +2201,9 @@ public class InternalMscriptLexer extends Lexer {
             }
             switch (alt12) {
                 case 1 :
-                    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20652:41: ( '\\r' )? '\\n'
+                    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20685:41: ( '\\r' )? '\\n'
                     {
-                    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20652:41: ( '\\r' )?
+                    // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20685:41: ( '\\r' )?
                     int alt11=2;
                     int LA11_0 = input.LA(1);
 
@@ -2212,7 +2212,7 @@ public class InternalMscriptLexer extends Lexer {
                     }
                     switch (alt11) {
                         case 1 :
-                            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20652:41: '\\r'
+                            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20685:41: '\\r'
                             {
                             match('\r'); 
 
@@ -2244,10 +2244,10 @@ public class InternalMscriptLexer extends Lexer {
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20654:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20654:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20687:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20687:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20654:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20687:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt13=0;
             loop13:
             do {
@@ -2301,8 +2301,8 @@ public class InternalMscriptLexer extends Lexer {
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20656:16: ( . )
-            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20656:18: .
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20689:16: ( . )
+            // ../org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscript.g:20689:18: .
             {
             matchAny(); 
 

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 2130 - 2042
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language.ui/src-gen/org/eclipselabs/mscript/language/ui/contentassist/antlr/internal/InternalMscriptParser.java


+ 1 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/Mscript.xtext

@@ -387,7 +387,7 @@ ForStatement:
 	'for' '(' iterationVariable=IterationVariable 'in' collectionExpression=Expression ')' body=Statement;
 
 DoWhileStatement:
-	'do' body=Statement '(' condition=Expression ')' ';';
+	'do' body=Statement 'while' '(' condition=Expression ')' ';';
 
 ContinueStatement:
 	{ContinueStatement} 'continue' ';';

+ 8 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/VariableAccess.java

@@ -50,4 +50,12 @@ public interface VariableAccess extends FeatureCall {
 	 */
 	void setStepExpression(StepExpression value);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" required="true"
+	 * @generated
+	 */
+	boolean isInitial();
+
 } // VariableAccess

+ 2 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/AstPackageImpl.java

@@ -3341,6 +3341,8 @@ public class AstPackageImpl extends EPackageImpl implements AstPackage {
 		initEClass(variableAccessEClass, VariableAccess.class, "VariableAccess", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getVariableAccess_StepExpression(), this.getStepExpression(), null, "stepExpression", null, 0, 1, VariableAccess.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		addEOperation(variableAccessEClass, ecorePackage.getEBoolean(), "isInitial", 1, 1, IS_UNIQUE, IS_ORDERED);
+
 		initEClass(stepExpressionEClass, StepExpression.class, "StepExpression", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
 		initEClass(rangeStepExpressionEClass, RangeStepExpression.class, "RangeStepExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

+ 25 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/ast/impl/VariableAccessImpl.java

@@ -6,13 +6,17 @@
  */
 package org.eclipselabs.mscript.language.ast.impl;
 
+import java.util.Iterator;
+
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipselabs.mscript.language.ast.AstPackage;
 import org.eclipselabs.mscript.language.ast.StepExpression;
+import org.eclipselabs.mscript.language.ast.StepN;
 import org.eclipselabs.mscript.language.ast.VariableAccess;
 
 /**
@@ -101,6 +105,27 @@ public class VariableAccessImpl extends FeatureCallImpl implements VariableAcces
 			eNotify(new ENotificationImpl(this, Notification.SET, AstPackage.VARIABLE_ACCESS__STEP_EXPRESSION, newStepExpression, newStepExpression));
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	public boolean isInitial() {
+		StepExpression stepExpression = getStepExpression();
+		if (stepExpression == null) {
+			return false;
+		}
+		if (stepExpression instanceof StepN) {
+			return false;
+		}
+		for (Iterator<EObject> it = stepExpression.eAllContents(); it.hasNext();) {
+			if (it.next() instanceof StepN) {
+				return false;
+			}
+		}
+		return true;
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->

+ 4 - 4
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/EquationPart.java

@@ -7,7 +7,7 @@
 package org.eclipselabs.mscript.language.functionmodel;
 
 import org.eclipse.emf.ecore.EObject;
-import org.eclipselabs.mscript.language.ast.VariableAccess;
+import org.eclipselabs.mscript.typesystem.Expression;
 
 /**
  * <!-- begin-user-doc -->
@@ -65,12 +65,12 @@ public interface EquationPart extends EObject {
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Variable Access</em>' reference.
-	 * @see #setVariableAccess(VariableAccess)
+	 * @see #setVariableAccess(Expression)
 	 * @see org.eclipselabs.mscript.language.functionmodel.FunctionModelPackage#getEquationPart_VariableAccess()
 	 * @model required="true"
 	 * @generated
 	 */
-	VariableAccess getVariableAccess();
+	Expression getVariableAccess();
 
 	/**
 	 * Sets the value of the '{@link org.eclipselabs.mscript.language.functionmodel.EquationPart#getVariableAccess <em>Variable Access</em>}' reference.
@@ -80,7 +80,7 @@ public interface EquationPart extends EObject {
 	 * @see #getVariableAccess()
 	 * @generated
 	 */
-	void setVariableAccess(VariableAccess value);
+	void setVariableAccess(Expression value);
 
 	/**
 	 * Returns the value of the '<em><b>Variable Step</b></em>' reference.

+ 30 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/FunctionModelPackage.java

@@ -354,6 +354,15 @@ public interface FunctionModelPackage extends EPackage {
 	 */
 	int VARIABLE_STEP__INITIAL = 2;
 
+	/**
+	 * The feature id for the '<em><b>Derivative</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_STEP__DERIVATIVE = 3;
+
 	/**
 	 * The feature id for the '<em><b>Using Equation Parts</b></em>' reference list.
 	 * <!-- begin-user-doc -->
@@ -361,7 +370,7 @@ public interface FunctionModelPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_STEP__USING_EQUATION_PARTS = 3;
+	int VARIABLE_STEP__USING_EQUATION_PARTS = 4;
 
 	/**
 	 * The number of structural features of the '<em>Variable Step</em>' class.
@@ -370,7 +379,7 @@ public interface FunctionModelPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_STEP_FEATURE_COUNT = 4;
+	int VARIABLE_STEP_FEATURE_COUNT = 5;
 
 	/**
 	 * The meta object id for the '{@link org.eclipselabs.mscript.language.functionmodel.VariableKind <em>Variable Kind</em>}' enum.
@@ -673,6 +682,17 @@ public interface FunctionModelPackage extends EPackage {
 	 */
 	EAttribute getVariableStep_Initial();
 
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipselabs.mscript.language.functionmodel.VariableStep#isDerivative <em>Derivative</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Derivative</em>'.
+	 * @see org.eclipselabs.mscript.language.functionmodel.VariableStep#isDerivative()
+	 * @see #getVariableStep()
+	 * @generated
+	 */
+	EAttribute getVariableStep_Derivative();
+
 	/**
 	 * Returns the meta object for the reference list '{@link org.eclipselabs.mscript.language.functionmodel.VariableStep#getUsingEquationParts <em>Using Equation Parts</em>}'.
 	 * <!-- begin-user-doc -->
@@ -944,6 +964,14 @@ public interface FunctionModelPackage extends EPackage {
 		 */
 		EAttribute VARIABLE_STEP__INITIAL = eINSTANCE.getVariableStep_Initial();
 
+		/**
+		 * The meta object literal for the '<em><b>Derivative</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VARIABLE_STEP__DERIVATIVE = eINSTANCE.getVariableStep_Derivative();
+
 		/**
 		 * The meta object literal for the '<em><b>Using Equation Parts</b></em>' reference list feature.
 		 * <!-- begin-user-doc -->

+ 2 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/VariableDescriptor.java

@@ -133,10 +133,10 @@ public interface VariableDescriptor extends EObject {
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @model indexRequired="true" initialRequired="true"
+	 * @model indexRequired="true" initialRequired="true" derivativeRequired="true"
 	 * @generated
 	 */
-	VariableStep getStep(int index, boolean initial);
+	VariableStep getStep(int index, boolean initial, boolean derivative);
 
 	/**
 	 * <!-- begin-user-doc -->

+ 27 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/VariableStep.java

@@ -20,6 +20,7 @@ import org.eclipse.emf.ecore.EObject;
  *   <li>{@link org.eclipselabs.mscript.language.functionmodel.VariableStep#getDescriptor <em>Descriptor</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.functionmodel.VariableStep#getIndex <em>Index</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.functionmodel.VariableStep#isInitial <em>Initial</em>}</li>
+ *   <li>{@link org.eclipselabs.mscript.language.functionmodel.VariableStep#isDerivative <em>Derivative</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.functionmodel.VariableStep#getUsingEquationParts <em>Using Equation Parts</em>}</li>
  * </ul>
  * </p>
@@ -109,6 +110,32 @@ public interface VariableStep extends EObject {
 	 */
 	void setInitial(boolean value);
 
+	/**
+	 * Returns the value of the '<em><b>Derivative</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Derivative</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Derivative</em>' attribute.
+	 * @see #setDerivative(boolean)
+	 * @see org.eclipselabs.mscript.language.functionmodel.FunctionModelPackage#getVariableStep_Derivative()
+	 * @model
+	 * @generated
+	 */
+	boolean isDerivative();
+
+	/**
+	 * Sets the value of the '{@link org.eclipselabs.mscript.language.functionmodel.VariableStep#isDerivative <em>Derivative</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Derivative</em>' attribute.
+	 * @see #isDerivative()
+	 * @generated
+	 */
+	void setDerivative(boolean value);
+
 	/**
 	 * Returns the value of the '<em><b>Using Equation Parts</b></em>' reference list.
 	 * The list contents are of type {@link org.eclipselabs.mscript.language.functionmodel.EquationPart}.

+ 78 - 43
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/construct/FunctionDescriptorConstructor.java

@@ -11,14 +11,17 @@
 
 package org.eclipselabs.mscript.language.functionmodel.construct;
 
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipselabs.mscript.language.ast.CallableElement;
+import org.eclipselabs.mscript.language.ast.DerivativeOperator;
 import org.eclipselabs.mscript.language.ast.Equation;
 import org.eclipselabs.mscript.language.ast.FunctionDefinition;
-import org.eclipselabs.mscript.language.ast.ParameterDeclaration;
+import org.eclipselabs.mscript.language.ast.InputParameterDeclaration;
+import org.eclipselabs.mscript.language.ast.OutputParameterDeclaration;
 import org.eclipselabs.mscript.language.ast.StateVariableDeclaration;
+import org.eclipselabs.mscript.language.ast.TemplateParameterDeclaration;
 import org.eclipselabs.mscript.language.ast.VariableAccess;
 import org.eclipselabs.mscript.language.ast.util.AstSwitch;
 import org.eclipselabs.mscript.language.functionmodel.EquationDescriptor;
@@ -30,9 +33,8 @@ import org.eclipselabs.mscript.language.functionmodel.VariableDescriptor;
 import org.eclipselabs.mscript.language.functionmodel.VariableKind;
 import org.eclipselabs.mscript.language.functionmodel.VariableStep;
 import org.eclipselabs.mscript.language.internal.LanguagePlugin;
-import org.eclipselabs.mscript.language.internal.functionmodel.util.StepExpressionHelper;
-import org.eclipselabs.mscript.language.internal.functionmodel.util.StepExpressionResult;
 import org.eclipselabs.mscript.language.internal.util.StatusUtil;
+import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
 import org.eclipselabs.mscript.language.util.SyntaxStatus;
 import org.eclipselabs.mscript.typesystem.Expression;
 
@@ -45,7 +47,7 @@ public class FunctionDescriptorConstructor implements IFunctionDescriptorConstru
 	/* (non-Javadoc)
 	 * @see org.eclipselabs.mscript.language.functionmodel.construct.IFunctionDescriptorConstructor#construct(org.eclipselabs.mscript.language.ast.FunctionDefinition)
 	 */
-	public IFunctionDescriptorConstructorResult construct(FunctionDefinition functionDefinition) {
+	public IFunctionDescriptorConstructorResult construct(IStaticEvaluationContext context, FunctionDefinition functionDefinition) {
 		MultiStatus status = new MultiStatus(LanguagePlugin.PLUGIN_ID, 0, "Function descriptor construction errors", null);
 
 		FunctionDescriptor functionDescriptor = FunctionModelFactory.eINSTANCE.createFunctionDescriptor();
@@ -60,13 +62,13 @@ public class FunctionDescriptorConstructor implements IFunctionDescriptorConstru
 			EquationSide lhs = FunctionModelFactory.eINSTANCE.createEquationSide();
 			lhs.setDescriptor(equationDescriptor);
 			lhs.setExpression(lhsExpression);
-			StatusUtil.merge(status, new EquationSideInitializer(lhs).initialize());
+			StatusUtil.merge(status, new EquationSideInitializer(context, lhs).initialize());
 			
 			Expression rhsExpression = equation.getRightHandSide();
 			EquationSide rhs = FunctionModelFactory.eINSTANCE.createEquationSide();
 			rhs.setDescriptor(equationDescriptor);
 			rhs.setExpression(rhsExpression);
-			StatusUtil.merge(status, new EquationSideInitializer(rhs).initialize());
+			StatusUtil.merge(status, new EquationSideInitializer(context, rhs).initialize());
 		}
 		
 		if (!status.isOK()) {
@@ -77,14 +79,16 @@ public class FunctionDescriptorConstructor implements IFunctionDescriptorConstru
 	}
 			
 	private static class EquationSideInitializer extends AstSwitch<Boolean> {
-
+		
+		private IStaticEvaluationContext context;
 		private EquationSide equationSide;
 		private MultiStatus status;
 		
 		/**
 		 * 
 		 */
-		public EquationSideInitializer(EquationSide equationSide) {
+		public EquationSideInitializer(IStaticEvaluationContext context, EquationSide equationSide) {
+			this.context = context;
 			this.equationSide = equationSide;
 		}
 		
@@ -93,15 +97,40 @@ public class FunctionDescriptorConstructor implements IFunctionDescriptorConstru
 			doSwitch(equationSide.getExpression());
 			return status;
 		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipselabs.mscript.language.ast.util.AstSwitch#caseDerivativeOperator(org.eclipselabs.mscript.language.ast.DerivativeOperator)
+		 */
+		@Override
+		public Boolean caseDerivativeOperator(DerivativeOperator derivativeOperator) {
+			String name = derivativeOperator.getVariable().getName();
+			
+			FunctionDescriptor functionDescriptor = equationSide.getDescriptor().getFunctionDescriptor();
+			VariableKind variableKind = getVariableKind(derivativeOperator.getVariable());
+			
+			if (variableKind != VariableKind.UNKNOWN) {
+				EquationPart part = FunctionModelFactory.eINSTANCE.createEquationPart();
+				part.setSide(equationSide);
+				part.setVariableAccess(derivativeOperator);
+				VariableDescriptor variableDescriptor = getVariableDescriptor(functionDescriptor, name, variableKind);
+				
+				VariableStep variableStep = variableDescriptor.getStep(0, false, true);
+				if (variableStep == null) {
+					variableStep = FunctionModelFactory.eINSTANCE.createVariableStep();
+					variableStep.setDescriptor(variableDescriptor);
+					variableStep.setDerivative(true);
+				}
+				part.setVariableStep(variableStep);
+			}
+			return true;
+		}
 
 		@Override
 		public Boolean caseVariableAccess(VariableAccess variableAccess) {
 			String name = variableAccess.getFeature().getName();
 			
 			FunctionDescriptor functionDescriptor = equationSide.getDescriptor().getFunctionDescriptor();
-			VariableKind variableKind = getVariableKind(
-					functionDescriptor.getDefinition(),
-					name);
+			VariableKind variableKind = getVariableKind(variableAccess.getFeature());
 			
 			checkFeatureCall(variableAccess, variableKind);
 			
@@ -112,27 +141,23 @@ public class FunctionDescriptorConstructor implements IFunctionDescriptorConstru
 				if (variableKind == VariableKind.INPUT_PARAMETER
 						|| variableKind == VariableKind.OUTPUT_PARAMETER
 						|| variableKind == VariableKind.STATE_VARIABLE) {
-					try {
-						StepExpressionResult stepExpressionResult = new StepExpressionHelper().getStepExpression(variableAccess);
-						stepIndex = stepExpressionResult.getIndex();
-						initial = stepExpressionResult.isInitial();
-					} catch (CoreException e) {
-						StatusUtil.merge(status, e.getStatus());
+					stepIndex = context.getStepIndex(variableAccess);
+					initial = variableAccess.isInitial();
+				}
+				
+				if (!initial) {
+					Equation equation = (Equation) equationSide.getExpression().eContainer();
+					if (equation.getLeftHandSide() == equationSide.getExpression() && equation.isInitial()) {
+						initial = true;
 					}
 				}
 
 				EquationPart part = FunctionModelFactory.eINSTANCE.createEquationPart();
 				part.setSide(equationSide);
 				part.setVariableAccess(variableAccess);
-				VariableDescriptor variableDescriptor = functionDescriptor.getVariableDescriptor(name);
-				if (variableDescriptor == null) {
-					variableDescriptor = FunctionModelFactory.eINSTANCE.createVariableDescriptor();
-					variableDescriptor.setFunctionDescriptor(functionDescriptor);
-					variableDescriptor.setName(name);
-					variableDescriptor.setKind(variableKind);
-				}
+				VariableDescriptor variableDescriptor = getVariableDescriptor(functionDescriptor, name, variableKind);
 				
-				VariableStep variableStep = variableDescriptor.getStep(stepIndex, initial);
+				VariableStep variableStep = variableDescriptor.getStep(stepIndex, initial, false);
 				if (variableStep == null) {
 					variableStep = FunctionModelFactory.eINSTANCE.createVariableStep();
 					variableStep.setDescriptor(variableDescriptor);
@@ -172,26 +197,36 @@ public class FunctionDescriptorConstructor implements IFunctionDescriptorConstru
 			}
 		}
 
-		private VariableKind getVariableKind(FunctionDefinition functionDefinition, String name) {
-			for (ParameterDeclaration parameterDeclaration : functionDefinition.getTemplateParameterDeclarations()) {
-				if (name.equals(parameterDeclaration.getName())) {
-					return VariableKind.TEMPLATE_PARAMETER;
-				}
+		/**
+		 * @param functionDescriptor
+		 * @param name
+		 * @param variableKind
+		 * @return
+		 */
+		private VariableDescriptor getVariableDescriptor(FunctionDescriptor functionDescriptor, String name,
+				VariableKind variableKind) {
+			VariableDescriptor variableDescriptor = functionDescriptor.getVariableDescriptor(name);
+			if (variableDescriptor == null) {
+				variableDescriptor = FunctionModelFactory.eINSTANCE.createVariableDescriptor();
+				variableDescriptor.setFunctionDescriptor(functionDescriptor);
+				variableDescriptor.setName(name);
+				variableDescriptor.setKind(variableKind);
 			}
-			for (ParameterDeclaration parameterDeclaration : functionDefinition.getInputParameterDeclarations()) {
-				if (name.equals(parameterDeclaration.getName())) {
-					return VariableKind.INPUT_PARAMETER;
-				}
+			return variableDescriptor;
+		}
+
+		private VariableKind getVariableKind(CallableElement feature) {
+			if (feature instanceof TemplateParameterDeclaration) {
+				return VariableKind.TEMPLATE_PARAMETER;
 			}
-			for (ParameterDeclaration parameterDeclaration : functionDefinition.getOutputParameterDeclarations()) {
-				if (name.equals(parameterDeclaration.getName())) {
-					return VariableKind.OUTPUT_PARAMETER;
-				}
+			if (feature instanceof InputParameterDeclaration) {
+				return VariableKind.INPUT_PARAMETER;
 			}
-			for (StateVariableDeclaration stateVariableDeclaration : functionDefinition.getStateVariableDeclarations()) {
-				if (name.equals(stateVariableDeclaration.getName())) {
-					return VariableKind.STATE_VARIABLE;
-				}
+			if (feature instanceof OutputParameterDeclaration) {
+				return VariableKind.OUTPUT_PARAMETER;
+			}
+			if (feature instanceof StateVariableDeclaration) {
+				return VariableKind.STATE_VARIABLE;
 			}
 			return VariableKind.UNKNOWN;
 		}

+ 2 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/construct/IFunctionDescriptorConstructor.java

@@ -12,6 +12,7 @@
 package org.eclipselabs.mscript.language.functionmodel.construct;
 
 import org.eclipselabs.mscript.language.ast.FunctionDefinition;
+import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
 
 /**
  * @author Andreas Unger
@@ -19,6 +20,6 @@ import org.eclipselabs.mscript.language.ast.FunctionDefinition;
  */
 public interface IFunctionDescriptorConstructor {
 
-	IFunctionDescriptorConstructorResult construct(FunctionDefinition functionDefinition);
+	IFunctionDescriptorConstructorResult construct(IStaticEvaluationContext context, FunctionDefinition functionDefinition);
 
 }

+ 3 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/EquationDescriptorImpl.java

@@ -23,6 +23,7 @@ import org.eclipse.emf.ecore.impl.EObjectImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipselabs.mscript.language.ast.DerivativeOperator;
 import org.eclipselabs.mscript.language.ast.Equation;
 import org.eclipselabs.mscript.language.ast.VariableAccess;
 import org.eclipselabs.mscript.language.functionmodel.EquationDescriptor;
@@ -252,6 +253,8 @@ public class EquationDescriptorImpl extends EObjectImpl implements EquationDescr
 				}
 				break;
 			}
+		} else if (lhsExpression instanceof DerivativeOperator) {
+			
 		} else {
 			message = "Left-hand side must be single variable reference";
 		}

+ 9 - 9
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/EquationPartImpl.java

@@ -13,11 +13,11 @@ import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.EObjectImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipselabs.mscript.language.ast.VariableAccess;
 import org.eclipselabs.mscript.language.functionmodel.EquationPart;
 import org.eclipselabs.mscript.language.functionmodel.EquationSide;
 import org.eclipselabs.mscript.language.functionmodel.FunctionModelPackage;
 import org.eclipselabs.mscript.language.functionmodel.VariableStep;
+import org.eclipselabs.mscript.typesystem.Expression;
 
 /**
  * <!-- begin-user-doc -->
@@ -43,7 +43,7 @@ public class EquationPartImpl extends EObjectImpl implements EquationPart {
 	 * @generated
 	 * @ordered
 	 */
-	protected VariableAccess variableAccess;
+	protected Expression variableAccess;
 
 	/**
 	 * The cached value of the '{@link #getVariableStep() <em>Variable Step</em>}' reference.
@@ -120,10 +120,10 @@ public class EquationPartImpl extends EObjectImpl implements EquationPart {
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public VariableAccess getVariableAccess() {
+	public Expression getVariableAccess() {
 		if (variableAccess != null && variableAccess.eIsProxy()) {
 			InternalEObject oldVariableAccess = (InternalEObject)variableAccess;
-			variableAccess = (VariableAccess)eResolveProxy(oldVariableAccess);
+			variableAccess = (Expression)eResolveProxy(oldVariableAccess);
 			if (variableAccess != oldVariableAccess) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, FunctionModelPackage.EQUATION_PART__VARIABLE_ACCESS, oldVariableAccess, variableAccess));
@@ -137,7 +137,7 @@ public class EquationPartImpl extends EObjectImpl implements EquationPart {
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public VariableAccess basicGetVariableAccess() {
+	public Expression basicGetVariableAccess() {
 		return variableAccess;
 	}
 
@@ -146,8 +146,8 @@ public class EquationPartImpl extends EObjectImpl implements EquationPart {
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setVariableAccess(VariableAccess newVariableAccess) {
-		VariableAccess oldVariableAccess = variableAccess;
+	public void setVariableAccess(Expression newVariableAccess) {
+		Expression oldVariableAccess = variableAccess;
 		variableAccess = newVariableAccess;
 		if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET, FunctionModelPackage.EQUATION_PART__VARIABLE_ACCESS, oldVariableAccess, variableAccess));
@@ -295,7 +295,7 @@ public class EquationPartImpl extends EObjectImpl implements EquationPart {
 				setSide((EquationSide)newValue);
 				return;
 			case FunctionModelPackage.EQUATION_PART__VARIABLE_ACCESS:
-				setVariableAccess((VariableAccess)newValue);
+				setVariableAccess((Expression)newValue);
 				return;
 			case FunctionModelPackage.EQUATION_PART__VARIABLE_STEP:
 				setVariableStep((VariableStep)newValue);
@@ -316,7 +316,7 @@ public class EquationPartImpl extends EObjectImpl implements EquationPart {
 				setSide((EquationSide)null);
 				return;
 			case FunctionModelPackage.EQUATION_PART__VARIABLE_ACCESS:
-				setVariableAccess((VariableAccess)null);
+				setVariableAccess((Expression)null);
 				return;
 			case FunctionModelPackage.EQUATION_PART__VARIABLE_STEP:
 				setVariableStep((VariableStep)null);

+ 1 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/FunctionDescriptorImpl.java

@@ -190,7 +190,7 @@ public class FunctionDescriptorImpl extends EObjectImpl implements FunctionDescr
 			if (!equationDescriptor.getLeftHandSide().getParts().isEmpty()) {
 				EquationPart equationPart = equationDescriptor.getLeftHandSide().getParts().get(0);
 				VariableStep variableStep = equationPart.getVariableStep();
-				VariableDescriptorWrapper descriptor = new VariableDescriptorWrapper(variableStep.getDescriptor().getName(), variableStep.getIndex());
+				VariableDescriptorWrapper descriptor = new VariableDescriptorWrapper(variableStep.getDescriptor().getName(), variableStep.getIndex(), false, variableStep.isDerivative());
 				EquationPart previousEquationPart = wrappers.put(descriptor, equationPart);
 				if (previousEquationPart != null) {
 					invalidEquationParts.add(equationPart);

+ 14 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/FunctionModelPackageImpl.java

@@ -400,13 +400,22 @@ public class FunctionModelPackageImpl extends EPackageImpl implements FunctionMo
 		return (EAttribute)variableStepEClass.getEStructuralFeatures().get(2);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVariableStep_Derivative() {
+		return (EAttribute)variableStepEClass.getEStructuralFeatures().get(3);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	public EReference getVariableStep_UsingEquationParts() {
-		return (EReference)variableStepEClass.getEStructuralFeatures().get(3);
+		return (EReference)variableStepEClass.getEStructuralFeatures().get(4);
 	}
 
 	/**
@@ -478,6 +487,7 @@ public class FunctionModelPackageImpl extends EPackageImpl implements FunctionMo
 		createEReference(variableStepEClass, VARIABLE_STEP__DESCRIPTOR);
 		createEAttribute(variableStepEClass, VARIABLE_STEP__INDEX);
 		createEAttribute(variableStepEClass, VARIABLE_STEP__INITIAL);
+		createEAttribute(variableStepEClass, VARIABLE_STEP__DERIVATIVE);
 		createEReference(variableStepEClass, VARIABLE_STEP__USING_EQUATION_PARTS);
 
 		// Create enums
@@ -596,7 +606,7 @@ public class FunctionModelPackageImpl extends EPackageImpl implements FunctionMo
 
 		initEClass(equationPartEClass, EquationPart.class, "EquationPart", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getEquationPart_Side(), this.getEquationSide(), this.getEquationSide_Parts(), "side", null, 0, 1, EquationPart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEquationPart_VariableAccess(), theAstPackage.getVariableAccess(), null, "variableAccess", null, 1, 1, EquationPart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEquationPart_VariableAccess(), theTypeSystemPackage.getExpression(), null, "variableAccess", null, 1, 1, EquationPart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEquationPart_VariableStep(), this.getVariableStep(), this.getVariableStep_UsingEquationParts(), "variableStep", null, 1, 1, EquationPart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(variableDescriptorEClass, VariableDescriptor.class, "VariableDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -608,6 +618,7 @@ public class FunctionModelPackageImpl extends EPackageImpl implements FunctionMo
 		op = addEOperation(variableDescriptorEClass, this.getVariableStep(), "getStep", 0, 1, IS_UNIQUE, IS_ORDERED);
 		addEParameter(op, ecorePackage.getEInt(), "index", 1, 1, IS_UNIQUE, IS_ORDERED);
 		addEParameter(op, ecorePackage.getEBoolean(), "initial", 1, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEBoolean(), "derivative", 1, 1, IS_UNIQUE, IS_ORDERED);
 
 		addEOperation(variableDescriptorEClass, this.getVariableStep(), "getMinimumStep", 1, 1, IS_UNIQUE, IS_ORDERED);
 
@@ -617,6 +628,7 @@ public class FunctionModelPackageImpl extends EPackageImpl implements FunctionMo
 		initEReference(getVariableStep_Descriptor(), this.getVariableDescriptor(), this.getVariableDescriptor_Steps(), "descriptor", null, 0, 1, VariableStep.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getVariableStep_Index(), ecorePackage.getEInt(), "index", null, 0, 1, VariableStep.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getVariableStep_Initial(), ecorePackage.getEBoolean(), "initial", null, 0, 1, VariableStep.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVariableStep_Derivative(), ecorePackage.getEBoolean(), "derivative", null, 0, 1, VariableStep.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getVariableStep_UsingEquationParts(), this.getEquationPart(), this.getEquationPart_VariableStep(), "usingEquationParts", null, 0, -1, VariableStep.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		// Initialize enums and add enum literals

+ 2 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/VariableDescriptorImpl.java

@@ -210,9 +210,9 @@ public class VariableDescriptorImpl extends EObjectImpl implements VariableDescr
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	public VariableStep getStep(int index, boolean initial) {
+	public VariableStep getStep(int index, boolean initial, boolean derivative) {
 		for (VariableStep step : getSteps()) {
-			if (step.getIndex() == index && step.isInitial() == initial) {
+			if (step.getIndex() == index && step.isInitial() == initial && step.isDerivative() == derivative) {
 				return step;
 			}
 		}

+ 54 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/functionmodel/impl/VariableStepImpl.java

@@ -33,6 +33,7 @@ import org.eclipselabs.mscript.language.functionmodel.VariableStep;
  *   <li>{@link org.eclipselabs.mscript.language.functionmodel.impl.VariableStepImpl#getDescriptor <em>Descriptor</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.functionmodel.impl.VariableStepImpl#getIndex <em>Index</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.functionmodel.impl.VariableStepImpl#isInitial <em>Initial</em>}</li>
+ *   <li>{@link org.eclipselabs.mscript.language.functionmodel.impl.VariableStepImpl#isDerivative <em>Derivative</em>}</li>
  *   <li>{@link org.eclipselabs.mscript.language.functionmodel.impl.VariableStepImpl#getUsingEquationParts <em>Using Equation Parts</em>}</li>
  * </ul>
  * </p>
@@ -80,6 +81,26 @@ public class VariableStepImpl extends EObjectImpl implements VariableStep {
 	 */
 	protected boolean initial = INITIAL_EDEFAULT;
 
+	/**
+	 * The default value of the '{@link #isDerivative() <em>Derivative</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isDerivative()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean DERIVATIVE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isDerivative() <em>Derivative</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isDerivative()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean derivative = DERIVATIVE_EDEFAULT;
+
 	/**
 	 * The cached value of the '{@link #getUsingEquationParts() <em>Using Equation Parts</em>}' reference list.
 	 * <!-- begin-user-doc -->
@@ -192,6 +213,27 @@ public class VariableStepImpl extends EObjectImpl implements VariableStep {
 			eNotify(new ENotificationImpl(this, Notification.SET, FunctionModelPackage.VARIABLE_STEP__INITIAL, oldInitial, initial));
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isDerivative() {
+		return derivative;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDerivative(boolean newDerivative) {
+		boolean oldDerivative = derivative;
+		derivative = newDerivative;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, FunctionModelPackage.VARIABLE_STEP__DERIVATIVE, oldDerivative, derivative));
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -267,6 +309,8 @@ public class VariableStepImpl extends EObjectImpl implements VariableStep {
 				return getIndex();
 			case FunctionModelPackage.VARIABLE_STEP__INITIAL:
 				return isInitial();
+			case FunctionModelPackage.VARIABLE_STEP__DERIVATIVE:
+				return isDerivative();
 			case FunctionModelPackage.VARIABLE_STEP__USING_EQUATION_PARTS:
 				return getUsingEquationParts();
 		}
@@ -291,6 +335,9 @@ public class VariableStepImpl extends EObjectImpl implements VariableStep {
 			case FunctionModelPackage.VARIABLE_STEP__INITIAL:
 				setInitial((Boolean)newValue);
 				return;
+			case FunctionModelPackage.VARIABLE_STEP__DERIVATIVE:
+				setDerivative((Boolean)newValue);
+				return;
 			case FunctionModelPackage.VARIABLE_STEP__USING_EQUATION_PARTS:
 				getUsingEquationParts().clear();
 				getUsingEquationParts().addAll((Collection<? extends EquationPart>)newValue);
@@ -316,6 +363,9 @@ public class VariableStepImpl extends EObjectImpl implements VariableStep {
 			case FunctionModelPackage.VARIABLE_STEP__INITIAL:
 				setInitial(INITIAL_EDEFAULT);
 				return;
+			case FunctionModelPackage.VARIABLE_STEP__DERIVATIVE:
+				setDerivative(DERIVATIVE_EDEFAULT);
+				return;
 			case FunctionModelPackage.VARIABLE_STEP__USING_EQUATION_PARTS:
 				getUsingEquationParts().clear();
 				return;
@@ -337,6 +387,8 @@ public class VariableStepImpl extends EObjectImpl implements VariableStep {
 				return index != INDEX_EDEFAULT;
 			case FunctionModelPackage.VARIABLE_STEP__INITIAL:
 				return initial != INITIAL_EDEFAULT;
+			case FunctionModelPackage.VARIABLE_STEP__DERIVATIVE:
+				return derivative != DERIVATIVE_EDEFAULT;
 			case FunctionModelPackage.VARIABLE_STEP__USING_EQUATION_PARTS:
 				return usingEquationParts != null && !usingEquationParts.isEmpty();
 		}
@@ -357,6 +409,8 @@ public class VariableStepImpl extends EObjectImpl implements VariableStep {
 		result.append(index);
 		result.append(", initial: ");
 		result.append(initial);
+		result.append(", derivative: ");
+		result.append(derivative);
 		result.append(')');
 		return result.toString();
 	}

+ 15 - 12
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/ExpressionTransformer.java

@@ -14,12 +14,13 @@ package org.eclipselabs.mscript.language.il.transform;
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipselabs.mscript.computation.core.value.IBooleanValue;
+import org.eclipselabs.mscript.computation.core.value.IValue;
 import org.eclipselabs.mscript.language.ast.AdditiveExpression;
 import org.eclipselabs.mscript.language.ast.ArrayConstructionIterationClause;
 import org.eclipselabs.mscript.language.ast.ArrayConstructionOperator;
@@ -50,8 +51,6 @@ import org.eclipselabs.mscript.language.il.LocalVariableDeclaration;
 import org.eclipselabs.mscript.language.il.VariableDeclaration;
 import org.eclipselabs.mscript.language.il.VariableReference;
 import org.eclipselabs.mscript.language.internal.LanguagePlugin;
-import org.eclipselabs.mscript.language.internal.functionmodel.util.StepExpressionHelper;
-import org.eclipselabs.mscript.language.internal.functionmodel.util.StepExpressionResult;
 import org.eclipselabs.mscript.language.util.SyntaxStatus;
 import org.eclipselabs.mscript.typesystem.BooleanLiteral;
 import org.eclipselabs.mscript.typesystem.Expression;
@@ -140,6 +139,15 @@ public class ExpressionTransformer extends AstSwitch<Expression> implements IExp
 	 */
 	@Override
 	public Expression caseIfExpression(IfExpression ifExpression) {
+		if (ifExpression.isStatic()) {
+			IValue value = context.getStaticEvaluationContext().getValue(ifExpression.getCondition());
+			if (value instanceof IBooleanValue) {
+				boolean condition = ((IBooleanValue) value).booleanValue();
+				Expression expression = condition ? ifExpression.getThenExpression() : ifExpression.getElseExpression();
+				return doSwitch(expression);
+			}
+		}
+		
 		LocalVariableDeclaration localVariableDeclaration = ILFactory.eINSTANCE.createLocalVariableDeclaration();
 		context.getCompound().getStatements().add(localVariableDeclaration);
 		IfStatement ifStatement = ILFactory.eINSTANCE.createIfStatement();
@@ -181,15 +189,10 @@ public class ExpressionTransformer extends AstSwitch<Expression> implements IExp
 	public Expression caseVariableAccess(VariableAccess variableAccess) {
 		VariableDeclaration variableDeclaration = context.getVariableDeclaration(variableAccess.getFeature().getName());
 		if (variableDeclaration != null) {
-			try {
-				StepExpressionResult stepExpressionResult = new StepExpressionHelper().getStepExpression(variableAccess);
-				VariableReference variableReference = ILFactory.eINSTANCE.createVariableReference();
-				variableReference.setTarget(variableDeclaration);
-				variableReference.setStepIndex(stepExpressionResult.getIndex());
-				return variableReference;
-			} catch (CoreException e) {
-				throw new RuntimeException(e);
-			}
+			VariableReference variableReference = ILFactory.eINSTANCE.createVariableReference();
+			variableReference.setTarget(variableDeclaration);
+			variableReference.setStepIndex(context.getStaticEvaluationContext().getStepIndex(variableAccess));
+			return variableReference;
 		}
 		return null;
 	}

+ 3 - 2
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/FunctionDefinitionTransformer.java

@@ -49,6 +49,7 @@ import org.eclipselabs.mscript.language.internal.functionmodel.util.FunctionMode
 import org.eclipselabs.mscript.language.internal.il.transform.AssertionEvaluator;
 import org.eclipselabs.mscript.language.internal.util.DataTypeAdaptor;
 import org.eclipselabs.mscript.language.internal.util.StatusUtil;
+import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
 import org.eclipselabs.mscript.typesystem.DataType;
 
 /**
@@ -60,7 +61,7 @@ public class FunctionDefinitionTransformer implements IFunctionDefinitionTransfo
 	/* (non-Javadoc)
 	 * @see org.eclipselabs.mscript.language.il.transform.IFunctionDefinitionTransformer#transform(org.eclipselabs.mscript.language.functionmodel.FunctionDescriptor, java.lang.String, java.util.List, java.util.List)
 	 */
-	public IFunctionDefinitionTransformerResult transform(FunctionDescriptor functionDescriptor, String functionName, List<IValue> templateArguments, List<DataType> inputParameterDataTypes) {
+	public IFunctionDefinitionTransformerResult transform(IStaticEvaluationContext staticEvaluationContext, FunctionDescriptor functionDescriptor, String functionName, List<IValue> templateArguments, List<DataType> inputParameterDataTypes) {
 		MultiStatus status = new MultiStatus(LanguagePlugin.PLUGIN_ID, 0, "Function definition transformation errors", null);
 
 		ILFunctionDefinition ilFunctionDefinition = ILFactory.eINSTANCE.createILFunctionDefinition();
@@ -74,7 +75,7 @@ public class FunctionDefinitionTransformer implements IFunctionDefinitionTransfo
 
 		Collection<List<EquationDescriptor>> equationCompounds = new EquationCompoundHelper().getEquationCompounds(functionDescriptor);
 		
-		IFunctionDefinitionTransformerContext context = new FunctionDefinitionTransformerContext(ilFunctionDefinition);
+		IFunctionDefinitionTransformerContext context = new FunctionDefinitionTransformerContext(staticEvaluationContext, ilFunctionDefinition);
 		StatusUtil.merge(status, constructInitializationCompound(context, equationCompounds, variableDeclarations));
 		StatusUtil.merge(status, constructComputationCompounds(context, equationCompounds, variableDeclarations));
 		

+ 3 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/FunctionDefinitionTransformerContext.java

@@ -20,6 +20,7 @@ import org.eclipselabs.mscript.language.il.InstanceVariableDeclaration;
 import org.eclipselabs.mscript.language.il.OutputVariableDeclaration;
 import org.eclipselabs.mscript.language.il.TemplateVariableDeclaration;
 import org.eclipselabs.mscript.language.il.VariableDeclaration;
+import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
 
 /**
  * @author Andreas Unger
@@ -34,7 +35,8 @@ public class FunctionDefinitionTransformerContext extends TransformerContext imp
 	/**
 	 * 
 	 */
-	public FunctionDefinitionTransformerContext(ILFunctionDefinition functionDefinition) {
+	public FunctionDefinitionTransformerContext(IStaticEvaluationContext staticEvaluationContext, ILFunctionDefinition functionDefinition) {
+		super(staticEvaluationContext);
 		this.functionDefinition = functionDefinition;
 	}
 	

+ 2 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/IFunctionDefinitionTransformer.java

@@ -15,6 +15,7 @@ import java.util.List;
 
 import org.eclipselabs.mscript.computation.core.value.IValue;
 import org.eclipselabs.mscript.language.functionmodel.FunctionDescriptor;
+import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
 import org.eclipselabs.mscript.typesystem.DataType;
 
 /**
@@ -23,7 +24,7 @@ import org.eclipselabs.mscript.typesystem.DataType;
  */
 public interface IFunctionDefinitionTransformer {
 
-	IFunctionDefinitionTransformerResult transform(FunctionDescriptor functionDescriptor, String functionName,
+	IFunctionDefinitionTransformerResult transform(IStaticEvaluationContext staticEvaluationContext, FunctionDescriptor functionDescriptor, String functionName,
 			List<IValue> templateArguments, List<DataType> inputParameterDataTypes);
 
 }

+ 3 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/ITransformerContext.java

@@ -13,6 +13,7 @@ package org.eclipselabs.mscript.language.il.transform;
 
 import org.eclipselabs.mscript.language.il.Compound;
 import org.eclipselabs.mscript.language.il.VariableDeclaration;
+import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
 
 /**
  * @author Andreas Unger
@@ -22,6 +23,8 @@ import org.eclipselabs.mscript.language.il.VariableDeclaration;
  */
 public interface ITransformerContext {
 
+	IStaticEvaluationContext getStaticEvaluationContext();
+	
 	void enterScope();
 	void leaveScope();
 	

+ 17 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/TransformerContext.java

@@ -14,6 +14,7 @@ package org.eclipselabs.mscript.language.il.transform;
 import org.eclipselabs.mscript.common.internal.util.Scope;
 import org.eclipselabs.mscript.language.il.Compound;
 import org.eclipselabs.mscript.language.il.VariableDeclaration;
+import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
 
 /**
  * @author Andreas Unger
@@ -21,8 +22,24 @@ import org.eclipselabs.mscript.language.il.VariableDeclaration;
  */
 public class TransformerContext implements ITransformerContext {
 
+	private IStaticEvaluationContext staticEvaluationContext;
+	
 	private TransformerScope scope = new TransformerScope(null);
 	
+	/**
+	 * 
+	 */
+	public TransformerContext(IStaticEvaluationContext staticEvaluationContext) {
+		this.staticEvaluationContext = staticEvaluationContext;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipselabs.mscript.language.il.transform.ITransformerContext#getStaticEvaluationContext()
+	 */
+	public IStaticEvaluationContext getStaticEvaluationContext() {
+		return staticEvaluationContext;
+	}
+	
 	/* (non-Javadoc)
 	 * @see org.eclipselabs.mscript.language.il.transform.IExpressionTransformerContext#enterScope()
 	 */

+ 4 - 4
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/internal/functionmodel/util/FunctionModelUtil.java

@@ -51,10 +51,10 @@ public class FunctionModelUtil {
 		return null;
 	}
 
-	public static EquationDescriptor getDefiningEquation(FunctionDescriptor functionDescriptor, String variableName, int stepIndex, boolean initial) {
+	public static EquationDescriptor getDefiningEquation(FunctionDescriptor functionDescriptor, String variableName, int stepIndex, boolean initial, boolean derivative) {
 		VariableDescriptor variableDescriptor = functionDescriptor.getVariableDescriptor(variableName);
 		if (variableDescriptor != null) {
-			VariableStep variableStep = variableDescriptor.getStep(stepIndex, initial);
+			VariableStep variableStep = variableDescriptor.getStep(stepIndex, initial, derivative);
 			if (variableStep != null) {
 				return getDefiningEquation(variableStep);
 			}
@@ -62,8 +62,8 @@ public class FunctionModelUtil {
 		return null;
 	}
 
-	public static TreeIterator<EquationDescriptor> getDefiningEquations(FunctionDescriptor functionDescriptor, String variableName, int stepIndex, boolean initial) {
-		EquationDescriptor root = getDefiningEquation(functionDescriptor, variableName, stepIndex, initial);
+	public static TreeIterator<EquationDescriptor> getDefiningEquations(FunctionDescriptor functionDescriptor, String variableName, int stepIndex, boolean initial, boolean derivative) {
+		EquationDescriptor root = getDefiningEquation(functionDescriptor, variableName, stepIndex, initial, derivative);
 		if (root != null) {
 			return new EquationIterator(root);
 		}

+ 0 - 45
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/internal/functionmodel/util/StepExpressionResult.java

@@ -1,45 +0,0 @@
-/****************************************************************************
- * Copyright (c) 2008, 2010 Andreas Unger and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Andreas Unger - initial API and implementation 
- ****************************************************************************/
-
-package org.eclipselabs.mscript.language.internal.functionmodel.util;
-
-/**
- * @author Andreas Unger
- *
- */
-public class StepExpressionResult {
-
-	private int index;
-	private boolean initial;
-	
-	/**
-	 * 
-	 */
-	public StepExpressionResult(int index, boolean initial) {
-		this.index = index;
-		this.initial = initial;
-	}
-	
-	/**
-	 * @return the step index
-	 */
-	public int getIndex() {
-		return index;
-	}
-	
-	/**
-	 * @return the initial
-	 */
-	public boolean isInitial() {
-		return initial;
-	}
-	
-}

+ 6 - 4
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/internal/functionmodel/util/VariableDescriptorWrapper.java

@@ -16,21 +16,23 @@ public class VariableDescriptorWrapper {
 	private String name;
 	private int step;
 	private boolean initial;
+	private boolean derivative;
 	
 	/**
 	 * 
 	 */
 	public VariableDescriptorWrapper(String name, int step) {
-		this(name, step, false);
+		this(name, step, false, false);
 	}
 	
 	/**
 	 * 
 	 */
-	public VariableDescriptorWrapper(String name, int step, boolean initial) {
+	public VariableDescriptorWrapper(String name, int step, boolean initial, boolean derivative) {
 		this.name = name;
 		this.step = step;
 		this.initial = initial;
+		this.derivative = derivative;
 	}
 
 	/* (non-Javadoc)
@@ -38,7 +40,7 @@ public class VariableDescriptorWrapper {
 	 */
 	@Override
 	public int hashCode() {
-		return name.hashCode() ^ step ^ (initial ? 1 : 0);
+		return name.hashCode() ^ step ^ (initial ? 1 : 0) ^ (derivative ? 2 : 0);
 	}
 	
 	/* (non-Javadoc)
@@ -51,7 +53,7 @@ public class VariableDescriptorWrapper {
 		}
 		if (obj instanceof VariableDescriptorWrapper) {
 			VariableDescriptorWrapper other = (VariableDescriptorWrapper) obj;
-			return other.name.equals(name) && other.step == step && other.initial == initial;
+			return other.name.equals(name) && other.step == step && other.initial == initial && other.derivative == derivative;
 		}
 		return false;
 	}

+ 2 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/internal/il/transform/AssertionEvaluator.java

@@ -26,6 +26,7 @@ import org.eclipselabs.mscript.language.il.transform.ITransformerContext;
 import org.eclipselabs.mscript.language.internal.LanguagePlugin;
 import org.eclipselabs.mscript.language.internal.util.StatusUtil;
 import org.eclipselabs.mscript.language.interpreter.IInterpreterContext;
+import org.eclipselabs.mscript.language.interpreter.StaticEvaluationContext;
 import org.eclipselabs.mscript.language.interpreter.StaticInterpreterContext;
 import org.eclipselabs.mscript.language.interpreter.util.ExpressionInterpreterHelper;
 import org.eclipselabs.mscript.language.util.SyntaxStatus;
@@ -46,7 +47,7 @@ public class AssertionEvaluator {
 				continue;
 			}
 			
-			ITransformerContext transformerContext = new FunctionDefinitionTransformerContext(functionDefinition);
+			ITransformerContext transformerContext = new FunctionDefinitionTransformerContext(new StaticEvaluationContext(), functionDefinition);
 			IInterpreterContext interpreterContext = new StaticInterpreterContext(new ComputationContext(), functionDefinition);
 			ExpressionInterpreterHelper expressionInterpreterHelper = new ExpressionInterpreterHelper(transformerContext, interpreterContext, assertion.getCondition());
 

+ 9 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/interpreter/IStaticEvaluationContext.java

@@ -13,6 +13,9 @@ package org.eclipselabs.mscript.language.interpreter;
 
 import org.eclipselabs.mscript.computation.core.IComputationContext;
 import org.eclipselabs.mscript.computation.core.value.IValue;
+import org.eclipselabs.mscript.language.ast.FunctionDefinition;
+import org.eclipselabs.mscript.language.ast.VariableAccess;
+import org.eclipselabs.mscript.language.functionmodel.FunctionDescriptor;
 
 /**
  * @author Andreas Unger
@@ -25,4 +28,10 @@ public interface IStaticEvaluationContext {
 	IValue getValue(Object key);
 	void setValue(Object key, IValue value);
 	
+	int getStepIndex(VariableAccess variableAccess);
+	void setStepIndex(VariableAccess variableAccess, int stepIndex);
+	
+	FunctionDescriptor getFunctionDescriptor(FunctionDefinition functionDefinition);
+	void setFunctionDescriptor(FunctionDefinition functionDefinition, FunctionDescriptor functionDescriptor);
+
 }

+ 39 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/interpreter/StaticEvaluationContext.java

@@ -17,6 +17,9 @@ import java.util.Map;
 import org.eclipselabs.mscript.computation.core.ComputationContext;
 import org.eclipselabs.mscript.computation.core.IComputationContext;
 import org.eclipselabs.mscript.computation.core.value.IValue;
+import org.eclipselabs.mscript.language.ast.FunctionDefinition;
+import org.eclipselabs.mscript.language.ast.VariableAccess;
+import org.eclipselabs.mscript.language.functionmodel.FunctionDescriptor;
 
 /**
  * @author Andreas Unger
@@ -28,6 +31,10 @@ public class StaticEvaluationContext implements IStaticEvaluationContext {
 	
 	private Map<Object, IValue> values = new HashMap<Object, IValue>();
 	
+	private Map<VariableAccess, Integer> stepIndices = new HashMap<VariableAccess, Integer>();
+	
+	private Map<FunctionDefinition, FunctionDescriptor> functionDescriptors = new HashMap<FunctionDefinition, FunctionDescriptor>();
+
 	/* (non-Javadoc)
 	 * @see org.eclipselabs.mscript.language.interpreter.IEvaluationContext#getComputationContext()
 	 */
@@ -49,4 +56,36 @@ public class StaticEvaluationContext implements IStaticEvaluationContext {
 		values.put(key, value);
 	}
 	
+	/* (non-Javadoc)
+	 * @see org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext#getStepIndex(org.eclipselabs.mscript.language.ast.VariableAccess)
+	 */
+	public int getStepIndex(VariableAccess variableAccess) {
+		Integer stepIndex = stepIndices.get(variableAccess);
+		if (stepIndex == null) {
+			return 0;
+		}
+		return stepIndex;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext#setStepIndex(org.eclipselabs.mscript.language.ast.VariableAccess, int)
+	 */
+	public void setStepIndex(VariableAccess variableAccess, int stepIndex) {
+		stepIndices.put(variableAccess, stepIndex);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext#getFunctionDescriptor(org.eclipselabs.mscript.language.ast.FunctionDefinition)
+	 */
+	public FunctionDescriptor getFunctionDescriptor(FunctionDefinition functionDefinition) {
+		return functionDescriptors.get(functionDefinition);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext#setFunctionDescriptor(org.eclipselabs.mscript.language.ast.FunctionDefinition, org.eclipselabs.mscript.language.functionmodel.FunctionDescriptor)
+	 */
+	public void setFunctionDescriptor(FunctionDefinition functionDefinition, FunctionDescriptor functionDescriptor) {
+		functionDescriptors.put(functionDefinition, functionDescriptor);
+	}
+	
 }

+ 33 - 1
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/interpreter/StaticFunctionEvaluator.java

@@ -11,15 +11,24 @@
 
 package org.eclipselabs.mscript.language.interpreter;
 
+import java.util.HashMap;
+
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
 import org.eclipselabs.mscript.computation.core.value.AnyValue;
 import org.eclipselabs.mscript.computation.core.value.IValue;
 import org.eclipselabs.mscript.computation.core.value.InvalidValue;
+import org.eclipselabs.mscript.language.ast.FunctionDefinition;
 import org.eclipselabs.mscript.language.ast.VariableAccess;
 import org.eclipselabs.mscript.language.functionmodel.EquationDescriptor;
 import org.eclipselabs.mscript.language.functionmodel.FunctionDescriptor;
+import org.eclipselabs.mscript.language.functionmodel.construct.FunctionDescriptorConstructor;
+import org.eclipselabs.mscript.language.functionmodel.construct.IFunctionDescriptorConstructorResult;
+import org.eclipselabs.mscript.language.functionmodel.util.FunctionModelValidator;
 import org.eclipselabs.mscript.language.internal.LanguagePlugin;
+import org.eclipselabs.mscript.language.internal.util.EObjectTreeIterator;
 import org.eclipselabs.mscript.language.internal.util.StatusUtil;
 import org.eclipselabs.mscript.language.util.SyntaxStatus;
 import org.eclipselabs.mscript.typesystem.DataType;
@@ -30,8 +39,31 @@ import org.eclipselabs.mscript.typesystem.util.TypeSystemUtil;
  *
  */
 public class StaticFunctionEvaluator {
+	
+	public IStatus evaluate(IStaticEvaluationContext context, FunctionDefinition functionDefinition) {
+		MultiStatus multiStatus = new MultiStatus(LanguagePlugin.PLUGIN_ID, 0, "Evaluation result", null);
+		StatusUtil.merge(multiStatus, new StaticStepExpressionEvaluator().evaluate(context, functionDefinition));
+
+		IFunctionDescriptorConstructorResult functionDescriptorConstructorResult = new FunctionDescriptorConstructor().construct(context, functionDefinition);
+		StatusUtil.merge(multiStatus, functionDescriptorConstructorResult.getStatus());
+		FunctionDescriptor functionDescriptor = functionDescriptorConstructorResult.getFunctionDescriptor();
+		context.setFunctionDescriptor(functionDefinition, functionDescriptor);
+
+		FunctionModelValidator validator = new FunctionModelValidator();
+		BasicDiagnostic diagnostics = new BasicDiagnostic();
+		for (EObjectTreeIterator it = new EObjectTreeIterator(functionDescriptor, true); it.hasNext();) {
+			validator.validate(it.next(), diagnostics, new HashMap<Object, Object>());
+		}
+		if (diagnostics.getSeverity() != Diagnostic.OK) {
+			StatusUtil.merge(multiStatus, SyntaxStatus.toStatus(diagnostics));
+		}
+
+		StatusUtil.merge(multiStatus, evaluate(context, functionDescriptor));
+		
+		return multiStatus;
+	}
 
-	public IStatus evaluate(IStaticEvaluationContext context, FunctionDescriptor functionDescriptor) {
+	private IStatus evaluate(IStaticEvaluationContext context, FunctionDescriptor functionDescriptor) {
 		MultiStatus status = new MultiStatus(LanguagePlugin.PLUGIN_ID, 0, "Evaluation result", null);
 		StaticExpressionEvaluator staticExpressionEvaluator = new StaticExpressionEvaluator();
 		for (EquationDescriptor equationDescriptor : functionDescriptor.getEquationDescriptors()) {

+ 27 - 33
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/internal/functionmodel/util/StepExpressionHelper.java

@@ -9,15 +9,17 @@
  *    Andreas Unger - initial API and implementation 
  ****************************************************************************/
 
-package org.eclipselabs.mscript.language.internal.functionmodel.util;
+package org.eclipselabs.mscript.language.interpreter;
+
+import java.util.Iterator;
 
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipselabs.mscript.language.ast.AdditiveStepExpression;
+import org.eclipselabs.mscript.language.ast.Equation;
+import org.eclipselabs.mscript.language.ast.FunctionDefinition;
 import org.eclipselabs.mscript.language.ast.NegateStepExpression;
-import org.eclipselabs.mscript.language.ast.StepExpression;
 import org.eclipselabs.mscript.language.ast.StepLiteral;
 import org.eclipselabs.mscript.language.ast.StepN;
 import org.eclipselabs.mscript.language.ast.VariableAccess;
@@ -29,35 +31,36 @@ import org.eclipselabs.mscript.language.util.SyntaxStatus;
  * @author Andreas Unger
  *
  */
-public class StepExpressionHelper {
-
-	public StepExpressionResult getStepExpression(VariableAccess variableAccess) throws CoreException {
-		if (variableAccess.getStepExpression() != null) {
-			return evaluateStepExpression(variableAccess.getStepExpression());
-		}
-		return new StepExpressionResult(0, false);
-	}
-
-	private StepExpressionResult evaluateStepExpression(StepExpression stepExpression) throws CoreException {
-		Evaluator evaluator = new Evaluator();
-		int result = evaluator.doSwitch(stepExpression);
-		IStatus status = evaluator.getStatus();
-		if (status.isOK()) {
-			return new StepExpressionResult(result, evaluator.isAbsolute());
+public class StaticStepExpressionEvaluator {
+		
+	/* (non-Javadoc)
+	 * @see org.eclipselabs.mscript.language.interpreter.IExpressionValueEvaluator#evaluate(org.eclipselabs.mscript.language.interpreter.IEvaluationContext, org.eclipselabs.mscript.language.ast.Expression)
+	 */
+	public IStatus evaluate(IStaticEvaluationContext context, FunctionDefinition functionDefinition) {
+		Evaluator evaluator = new Evaluator(context);
+		for (Equation equation : functionDefinition.getEquations()) {
+			for (Iterator<EObject> it = equation.eAllContents(); it.hasNext();) {
+				EObject next = it.next();
+				if (next instanceof VariableAccess) {
+					VariableAccess variableAccess = (VariableAccess) next;
+					if (variableAccess.getStepExpression() != null) {
+						Integer stepIndex = evaluator.doSwitch(variableAccess.getStepExpression());
+						context.setStepIndex(variableAccess, stepIndex);
+					}
+				}
+			}
 		}
-		throw new CoreException(status);
+		return evaluator.getStatus();
 	}
 	
 	private static class Evaluator extends AstSwitch<Integer> {
-	
-		private MultiStatus status;
 		
-		private boolean absolute = true;
+		private MultiStatus status;
 		
 		/**
 		 * 
 		 */
-		public Evaluator() {
+		public Evaluator(IStaticEvaluationContext context) {
 			status = new MultiStatus(LanguagePlugin.PLUGIN_ID, 0, "Step expression evaluation failed", null);
 		}
 		
@@ -68,10 +71,6 @@ public class StepExpressionHelper {
 			return status;
 		}
 		
-		public boolean isAbsolute() {
-			return absolute;
-		}
-		
 		/* (non-Javadoc)
 		 * @see org.eclipselabs.mscript.language.ast.util.AstSwitch#caseAdditiveStepExpression(org.eclipselabs.mscript.language.ast.AdditiveStepExpression)
 		 */
@@ -109,11 +108,6 @@ public class StepExpressionHelper {
 		 */
 		@Override
 		public Integer caseStepN(StepN stepN) {
-			if (absolute) {
-				absolute = false;
-			} else {
-				status.add(new SyntaxStatus(IStatus.ERROR, LanguagePlugin.PLUGIN_ID, 0, "Duplicate 'n'", stepN));
-			}
 			return 0;
 		}
 		
@@ -127,5 +121,5 @@ public class StepExpressionHelper {
 		}
 	
 	}
-
+	
 }

+ 10 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/interpreter/builtin/RoundFunction.java

@@ -14,9 +14,14 @@ package org.eclipselabs.mscript.language.interpreter.builtin;
 import java.util.Collections;
 import java.util.List;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipselabs.mscript.computation.core.IComputationContext;
+import org.eclipselabs.mscript.computation.core.value.AnyValue;
 import org.eclipselabs.mscript.computation.core.value.ISimpleNumericValue;
 import org.eclipselabs.mscript.computation.core.value.IValue;
+import org.eclipselabs.mscript.typesystem.IntegerType;
+import org.eclipselabs.mscript.typesystem.NumericType;
+import org.eclipselabs.mscript.typesystem.TypeSystemFactory;
 
 /**
  * @author Andreas Unger
@@ -26,6 +31,11 @@ public class RoundFunction implements IFunction {
 
 	public List<IValue> call(IComputationContext context, List<? extends IValue> arguments) {
 		IValue argument = arguments.get(0);
+		if (argument instanceof AnyValue) {
+			IntegerType outputDataType = TypeSystemFactory.eINSTANCE.createIntegerType();
+			outputDataType.setUnit(EcoreUtil.copy(((NumericType) argument.getDataType()).getUnit()));
+			return Collections.<IValue>singletonList(new AnyValue(context, outputDataType));
+		}
 		if (argument instanceof ISimpleNumericValue) {
 			IValue result = ((ISimpleNumericValue) argument).round();
 			return Collections.singletonList(result);

+ 14 - 0
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/util/SyntaxStatus.java

@@ -11,7 +11,10 @@
 
 package org.eclipselabs.mscript.language.util;
 
+import java.util.List;
+
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.emf.common.util.BasicDiagnostic;
 import org.eclipse.emf.common.util.Diagnostic;
@@ -80,5 +83,16 @@ public class SyntaxStatus extends Status implements ISyntaxStatus {
 			}
 		}
 	}
+	
+	public static IStatus toStatus(Diagnostic diagnostic) {
+		MultiStatus multiStatus = new MultiStatus(LanguagePlugin.PLUGIN_ID, 0, "", null);
+		for (Diagnostic child : diagnostic.getChildren()) {
+			List<?> data = child.getData();
+			if (data != null && !data.isEmpty() && data.get(0) instanceof EObject) {
+				multiStatus.add(new SyntaxStatus(diagnostic.getSeverity(), LanguagePlugin.PLUGIN_ID, 0, child.getMessage(), (EObject) data.get(0)));
+			}
+		}
+		return multiStatus;
+	}
 
 }

+ 1 - 62
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/validation/MscriptJavaValidator.java

@@ -1,9 +1,6 @@
 package org.eclipselabs.mscript.language.validation;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.emf.ecore.EObject;
@@ -37,22 +34,12 @@ import org.eclipselabs.mscript.language.ast.StateVariableDeclaration;
 import org.eclipselabs.mscript.language.ast.StepN;
 import org.eclipselabs.mscript.language.ast.TemplateParameterDeclaration;
 import org.eclipselabs.mscript.language.ast.VariableAccess;
-import org.eclipselabs.mscript.language.functionmodel.FunctionDescriptor;
-import org.eclipselabs.mscript.language.functionmodel.construct.FunctionDescriptorConstructor;
-import org.eclipselabs.mscript.language.functionmodel.construct.IFunctionDescriptorConstructorResult;
-import org.eclipselabs.mscript.language.functionmodel.util.FunctionModelValidator;
-import org.eclipselabs.mscript.language.il.transform.FunctionDefinitionTransformer;
-import org.eclipselabs.mscript.language.il.transform.IFunctionDefinitionTransformerResult;
-import org.eclipselabs.mscript.language.internal.util.EObjectTreeIterator;
 import org.eclipselabs.mscript.language.interpreter.IStaticEvaluationContext;
 import org.eclipselabs.mscript.language.interpreter.StaticEvaluationContext;
 import org.eclipselabs.mscript.language.interpreter.StaticExpressionEvaluator;
 import org.eclipselabs.mscript.language.interpreter.StaticFunctionEvaluator;
 import org.eclipselabs.mscript.language.util.SyntaxStatus;
-import org.eclipselabs.mscript.typesystem.AnyDataType;
-import org.eclipselabs.mscript.typesystem.DataType;
 import org.eclipselabs.mscript.typesystem.Expression;
-import org.eclipselabs.mscript.typesystem.TypeSystemFactory;
 
 public class MscriptJavaValidator extends AbstractMscriptJavaValidator {
 
@@ -138,56 +125,8 @@ public class MscriptJavaValidator extends AbstractMscriptJavaValidator {
 		return container instanceof ArraySubscript && ((ArraySubscript) container).eContainer() instanceof ArrayElementAccess;
 	}
 	
-//	@Check
-	public void checkFunctionDefinition(FunctionDefinition functionDefinition) {
-		IFunctionDescriptorConstructorResult functionDescriptorConstructorResult = new FunctionDescriptorConstructor().construct(functionDefinition);
-		
-		SyntaxStatus.addAllSyntaxStatusesToDiagnostics(
-				functionDescriptorConstructorResult.getStatus(),
-				getChain());
-		
-		FunctionDescriptor functionDescriptor = functionDescriptorConstructorResult.getFunctionDescriptor();
-		
-		FunctionModelValidator validator = new FunctionModelValidator();
-		for (EObjectTreeIterator it = new EObjectTreeIterator(functionDescriptor, true); it.hasNext();) {
-			validator.validate(it.next(), getChain(), new HashMap<Object, Object>());
-		}
-
-		List<IValue> templateArguments = new ArrayList<IValue>();
-		for (int i = 0, n = functionDefinition.getTemplateParameterDeclarations().size(); i < n; ++i) {
-			AnyDataType type = TypeSystemFactory.eINSTANCE.createAnyDataType();
-			AnyValue value = new AnyValue(new ComputationContext(), type);
-			templateArguments.add(value);
-		}
-
-		List<DataType> inputParameterDataTypes = new ArrayList<DataType>();
-		for (int i = 0, n = functionDefinition.getInputParameterDeclarations().size(); i < n; ++i) {
-			AnyDataType type = TypeSystemFactory.eINSTANCE.createAnyDataType();
-			inputParameterDataTypes.add(type);
-		}
-
-		IFunctionDefinitionTransformerResult functionDefinitionTransformerResult = new FunctionDefinitionTransformer().transform(functionDescriptor, null, templateArguments, inputParameterDataTypes);
-
-		SyntaxStatus.addAllSyntaxStatusesToDiagnostics(
-				functionDefinitionTransformerResult.getStatus(),
-				getChain());
-	}
-	
 	@Check
 	public void checkTypes(FunctionDefinition functionDefinition) {
-		IFunctionDescriptorConstructorResult functionDescriptorConstructorResult = new FunctionDescriptorConstructor().construct(functionDefinition);
-		
-		SyntaxStatus.addAllSyntaxStatusesToDiagnostics(
-				functionDescriptorConstructorResult.getStatus(),
-				getChain());
-		
-		FunctionDescriptor functionDescriptor = functionDescriptorConstructorResult.getFunctionDescriptor();
-		
-		FunctionModelValidator validator = new FunctionModelValidator();
-		for (EObjectTreeIterator it = new EObjectTreeIterator(functionDescriptor, true); it.hasNext();) {
-			validator.validate(it.next(), getChain(), new HashMap<Object, Object>());
-		}
-
 		StaticExpressionEvaluator staticExpressionEvaluator = new StaticExpressionEvaluator();
 		for (org.eclipselabs.mscript.language.ast.Check check : functionDefinition.getChecks()) {
 			if (!checkFunctionCheckSignatures(check)) {
@@ -207,7 +146,7 @@ public class MscriptJavaValidator extends AbstractMscriptJavaValidator {
 				context.setValue(inputParameterIt.next(), new AnyValue(new ComputationContext(), dataTypeSpecifier.getType()));
 			}
 
-			IStatus status = new StaticFunctionEvaluator().evaluate(context, functionDescriptor);
+			IStatus status = new StaticFunctionEvaluator().evaluate(context, functionDefinition);
 			
 			if (status.isOK()) {
 				Iterator<OutputParameterDeclaration> outputParameterIt = functionDefinition.getOutputParameterDeclarations().iterator();