/// <summary>
        /// Called so as to make the necessary decision making whilst the state machine is discarding code during a failed if
        /// </summary>
        /// <param name="sourceLine">source line under analysis</param>
        /// <param name="sourceLineType">source code type as inspected by the Inspect function in the conditional inclusions machine</param>
        /// <param name="expression">expression to be evaluated in case the source Line type is an elif</param>
        /// <param name="subtitutionText"></param>
        public void Process(ref string sourceLine, SourceLineType sourceLineType, string expression, string subtitutionText)
        {
            sourceLine = "";
            switch (sourceLineType)
            {
            case SourceLineType.Ifclause:
            case SourceLineType.Ifdefclause:
            case SourceLineType.Ifndefclause:
                /*
                 * In case we encounter an other if whilst discarding we add an other layer
                 * so as to keep the matching endif clauses.
                 *
                 * The reason why we push DiscardingDueToSuccessfullIf is to suppress any
                 * attempt any elif and else at this level.
                 */
                _conditionalInclusionsMachine.AddState(ParserState.DiscardingDueToSuccessfullIf);
                break;

            case SourceLineType.Elifclause:
                switch (_conditionalInclusionsMachine.Evaluator.EvaluateExpression(expression, _conditionalInclusionsMachine.DefinesHandler))
                {
                case EvaluationResult.IsFalse:
                    /*
                     * in case the evaluation failed the state remains the same. We just
                     * continue discarding.
                     */
                    break;

                case EvaluationResult.IsTrue:
                    /*
                     * in case the evaluation is successfull we just change the state of
                     * the current level
                     */
                    _conditionalInclusionsMachine.UpdateCurrentState(ParserState.IncludingDueToIf);
                    break;

                case EvaluationResult.UnDetermined:
                    throw new SourceDiscoveryException(string.Format(CultureInfo.InvariantCulture, "Unable to evaluate expression \"{0}\"", expression));
                }
                break;

            case SourceLineType.Elseclause:
                _conditionalInclusionsMachine.UpdateCurrentState(ParserState.IncludingDueToIf);
                break;

            case SourceLineType.Endifclause:
                _conditionalInclusionsMachine.FinishWithCurrentState();
                break;
            }
        }
        /// <summary>
        /// Called so as to make the necessary decision making when a positively evaluated conditional has been met
        /// </summary>
        /// <param name="sourceLine">source line under analysis that may or may not be filtered</param>
        /// <param name="sourceLineType">source code type as inspected by the Inspect function in the conditional inclusions machine</param>
        /// <param name="expression">expression to be evaluated in case the source Line type is a conditional based on an expression</param>
        /// <param name="subtitutionText">substitution text in case of a define</param>
        public void Process(ref string sourceLine, SourceLineType sourceLineType, string expression, string subtitutionText)
        {
            switch (sourceLineType)
            {
            case SourceLineType.Other:
                //Encountered source code NOT related to the conditional inclusions.
                break;

            case SourceLineType.Elifclause:
                //since we were in successfull if inclusion and now we met an elif we have to discard anything in the elif
                _conditionalInclusionsMachine.UpdateCurrentState(ParserState.DiscardingDueToSuccessfullIf);
                sourceLine = "";
                break;

            case SourceLineType.Elseclause:
                _conditionalInclusionsMachine.UpdateCurrentState(ParserState.DiscardingDueToSuccessfullIf);
                sourceLine = "";
                break;

            case SourceLineType.Endifclause:
                _conditionalInclusionsMachine.FinishWithCurrentState();
                sourceLine = "";
                break;

            case SourceLineType.Ifclause:
                switch (_conditionalInclusionsMachine.Evaluator.EvaluateExpression(expression, _conditionalInclusionsMachine.DefinesHandler))
                {
                case EvaluationResult.IsFalse:
                    _conditionalInclusionsMachine.AddState(ParserState.DiscardingDueToFailedIf);
                    break;

                case EvaluationResult.IsTrue:
                    _conditionalInclusionsMachine.AddState(ParserState.IncludingDueToIf);
                    break;

                case EvaluationResult.UnDetermined:
                    throw new SourceDiscoveryException(string.Format(CultureInfo.InvariantCulture, "Unable to evaluate expression \"{0}\"", expression));
                }
                sourceLine = "";
                break;

            case SourceLineType.MultiLineDefineclause:
                _conditionalInclusionsMachine.AddState(ParserState.DiscardingDueToMultilineDefine);
                _conditionalInclusionsMachine.DefinesHandler.Define(expression, "");
                sourceLine = "";
                break;

            case SourceLineType.Defineclause:
                _conditionalInclusionsMachine.DefinesHandler.Define(expression, subtitutionText);
                sourceLine = "";
                break;

            case SourceLineType.Undefineclause:
                _conditionalInclusionsMachine.DefinesHandler.UnDefine(expression);
                sourceLine = "";
                break;

            case SourceLineType.Ifdefclause:
                switch (_conditionalInclusionsMachine.DefinesHandler.IsDefined(expression))
                {
                case true:
                    _conditionalInclusionsMachine.AddState(ParserState.IncludingDueToIf);
                    break;

                case false:
                    _conditionalInclusionsMachine.AddState(ParserState.DiscardingDueToFailedIf);
                    break;
                }
                sourceLine = "";
                break;

            case SourceLineType.Ifndefclause:
                switch (_conditionalInclusionsMachine.DefinesHandler.IsDefined(expression))
                {
                case true:
                    _conditionalInclusionsMachine.AddState(ParserState.DiscardingDueToFailedIf);
                    break;

                case false:
                    _conditionalInclusionsMachine.AddState(ParserState.IncludingDueToIf);
                    break;
                }
                sourceLine = "";
                break;
            }
        }
예제 #3
0
        public void Process(ref string sourceLine, SourceLineType sourceLineType, string expression, string subtitutionText)
        {
            switch (sourceLineType)
            {
            case SourceLineType.Ifdefclause:
                switch (_conditionalInclusionsMachine.DefinesHandler.IsDefined(expression))
                {
                case true:
                    _conditionalInclusionsMachine.AddState(ParserState.IncludingDueToIf);
                    break;

                case false:
                    _conditionalInclusionsMachine.AddState(ParserState.DiscardingDueToFailedIf);
                    break;
                }
                sourceLine = "";
                break;

            case SourceLineType.Ifndefclause:
                switch (_conditionalInclusionsMachine.DefinesHandler.IsDefined(expression))
                {
                case true:
                    _conditionalInclusionsMachine.AddState(ParserState.DiscardingDueToFailedIf);
                    break;

                case false:
                    _conditionalInclusionsMachine.AddState(ParserState.IncludingDueToIf);
                    break;
                }
                sourceLine = "";
                break;

            case SourceLineType.Ifclause:
                switch (_conditionalInclusionsMachine.Evaluator.EvaluateExpression(expression, _conditionalInclusionsMachine.DefinesHandler))
                {
                case EvaluationResult.IsFalse:
                    _conditionalInclusionsMachine.AddState(ParserState.DiscardingDueToFailedIf);
                    break;

                case EvaluationResult.IsTrue:
                    _conditionalInclusionsMachine.AddState(ParserState.IncludingDueToIf);
                    break;

                case EvaluationResult.UnDetermined:
                    throw new SourceDiscoveryException(string.Format(CultureInfo.InvariantCulture, "Unable to evaluate expression \"{0}\"", expression));
                }
                sourceLine = "";
                break;

            case SourceLineType.MultiLineDefineclause:
                _conditionalInclusionsMachine.AddState(ParserState.DiscardingDueToMultilineDefine);
                _conditionalInclusionsMachine.DefinesHandler.Define(expression, "");
                sourceLine = "";
                break;

            case SourceLineType.Defineclause:
                _conditionalInclusionsMachine.DefinesHandler.Define(expression, subtitutionText);
                sourceLine = "";
                break;

            case SourceLineType.Undefineclause:
                _conditionalInclusionsMachine.DefinesHandler.UnDefine(expression);
                sourceLine = "";
                break;

            case SourceLineType.Other:
                //Encountered source code NOT related to the conditional inclusions.
                break;

            case SourceLineType.Elifclause:
                // ReSharper disable once StringLiteralTypo
                throw new SourceDiscoveryException("unexpected #elif found.");

            case SourceLineType.Elseclause:
                throw new SourceDiscoveryException("unexpected #else found.");

            case SourceLineType.Endifclause:
                throw new SourceDiscoveryException("unexpected #endif found.");

            default:
                throw new SourceDiscoveryException("unexpected conditional found. code " + sourceLineType);
            }
        }