/// <summary> /// Called so as to make the necessary decision making whilst the state machine is discarding code during a multiline define /// </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">not used</param> /// <param name="subtitutionText">not used</param> public void Process(ref string sourceLine, SourceLineType sourceLineType, string expression, string subtitutionText) { if (!(defineRegexMultilineContinuation.IsMatch(sourceLine))) { //last line of the multiline define met (which should be discarded as well) _conditionalInclusionsMachine.FinishWithCurrentState(); } { //still in the multiline define } sourceLine = ""; }
/// <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; } }