/// <summary> /// Check that a variable declared in the root of a BaZic program is and only is an expression that contains only primitive values. /// </summary> /// <param name="expression">The expression to check,</param> private void ValidateGlobalVariableDeclarationDefaultValue(AbstractSyntaxTree.Expression expression) { if (expression == null) { return; } switch (expression) { case ArrayCreationExpression arrayCreation: foreach (var value in arrayCreation.Values) { ValidateGlobalVariableDeclarationDefaultValue(value); } break; case ArrayIndexerExpression arrayIndexer: ValidateGlobalVariableDeclarationDefaultValue(arrayIndexer.TargetObject); break; case BinaryOperatorExpression binaryOperator: ValidateGlobalVariableDeclarationDefaultValue(binaryOperator.LeftExpression); ValidateGlobalVariableDeclarationDefaultValue(binaryOperator.RightExpression); break; case NotOperatorExpression notOperator: ValidateGlobalVariableDeclarationDefaultValue(notOperator.Expression); break; case PrimitiveExpression primitive: // It's OK. break; default: AddIssue(new BaZicParserException(expression.Line, expression.Column, expression.StartOffset, expression.NodeLength, L.BaZic.Parser.VariableDefaultValue)); break; } }
/// <summary> /// Valudate a given expression. /// </summary> /// <param name="expression">The expression to analyze.</param> private void AnalyzeExpression(AbstractSyntaxTree.Expression expression) { if (expression == null) { return; } switch (expression) { case ArrayIndexerExpression arrayIndexer: ValidateArrayIndexerExpression(arrayIndexer); break; case ClassReferenceExpression classReference: break; case PropertyReferenceExpression propertyReference: AnalyzeExpression(propertyReference.TargetObject); break; case VariableReferenceExpression variableReference: ValidateVariableReferenceExpression(variableReference); break; case ExceptionReferenceExpression exception: break; case InvokeCoreMethodExpression invokeCoreMethod: ValidateCoreMethodInvocation(invokeCoreMethod); break; case InvokeMethodExpression invokeMethod: break; case PrimitiveExpression primitive: break; case BinaryOperatorExpression binaryOperator: AnalyzeExpression(binaryOperator.LeftExpression); AnalyzeExpression(binaryOperator.RightExpression); break; case NotOperatorExpression notOperator: AnalyzeExpression(notOperator.Expression); break; case InstantiateExpression instantiate: foreach (var value in instantiate.Arguments) { AnalyzeExpression(value); } break; case ArrayCreationExpression arrayCreation: foreach (var value in arrayCreation.Values) { AnalyzeExpression(value); } break; default: throw new NotImplementedException(L.BaZic.Parser.FormattedNoExpressionAnalyzer(expression.GetType().FullName)); } }