public static PainCodeLine NextOnSameOrHigher( this PainCodeLines Lines, PainCodeLine StartLine) { Int32 depth = (StartLine == null ? 0 : StartLine.Depth); Int32 index = (StartLine == null ? 0 : Lines.IndexOf(StartLine)); if (index < 0) { return(null); } for (var i = index + 1; i < Lines.Count; i++) { PainCodeLine line = Lines[i]; if (!line.IsLineEmpty) { if (line.Depth > depth) { return(line); } else if (line.Depth == depth) { return(line); } } } return(null); }
public static PainCodeLine PrevLineWithLessDepth( this PainCodeLines Lines, PainCodeLine StartLine, Func <PainCodeLine, Boolean> Predicate) { Int32 depth = (StartLine == null ? 0 : StartLine.Depth); Int32 index = (StartLine == null ? 0 : Lines.IndexOf(StartLine)); if (index < 0) { return(null); } for (var i = index - 1; i >= 0; i--) { PainCodeLine line = Lines[i]; if (!line.IsLineEmpty && line.Depth < depth) { if (Predicate == null || Predicate(line)) { return(line); } } } return(null); }
public static PainCodeLine NextOnSameOrLower( this PainCodeLines Lines, PainCodeLine StartLine, Func <PainCodeLine, Boolean> Predicate = null) { Int32 depth = (StartLine == null ? 0 : StartLine.Depth); Int32 index = (StartLine == null ? 0 : Lines.IndexOf(StartLine)); if (index < 0) { return(null); } for (var i = index + 1; i < Lines.Count; i++) { PainCodeLine line = Lines[i]; if (!line.IsLineEmpty && line.Depth <= depth) { if (Predicate == null || Predicate(line)) { return(line); } } } return(null); }
public static PainCodeLine ExitParentIf( this PainCodeLines Lines, PainCodeLine StartLine) { Int32 depth = (StartLine == null ? 0 : StartLine.Depth); Int32 index = (StartLine == null ? 0 : Lines.IndexOf(StartLine)); if (index < 0) { return(null); } PainCodeLine line = StartLine; while (true) { line = NextLine( Lines, line); if (line == null) { break; } if (line.Depth < StartLine.Depth) { return(line); } if (line.Depth == StartLine.Depth && line.OperatorType != EOperatorType.ELIF && line.OperatorType != EOperatorType.ELSE) { return(line); } } return(null); }
private static Boolean GotoCatch( PainContext PainContext, Exception exception) { while (true) { PainState currentState = PainContext. CurrentState; // reset dla kontekstu obliczeń, ponieważ przechodzimy do catch'a currentState.ExpressionContext = null; PainCodeLines lines = currentState.GetCurrentLines(); PainCodeLine currentLine = currentState.GetCurrentLine(); // poszukanie poprzedniego catch'a PainCodeLine prevCatch = lines. PrevLineWithLessDepth(currentLine, l => l.OperatorType == EOperatorType.CATCH); // poszukanie poprzedniego try'a PainCodeLine prevTry = lines. PrevLineWithLessDepth(currentLine, l => l.OperatorType == EOperatorType.TRY); if (prevTry == null) { ExitCurrentContext( PainContext); if (PainContext.IsFinished) { break; } } // jeśli znalazł try'a i nie jesteśmy w catch'u else if (prevTry.Depth < currentLine.Depth && (prevCatch == null || lines.IndexOf(prevCatch) < lines.IndexOf(prevTry))) { PainCodeLine nextCatch = lines.NextOnSameOrLower( prevTry, i => i.OperatorType == EOperatorType.CATCH); if (nextCatch != null) { ExpressionToken variableForException = nextCatch.ExpressionGroup != null && nextCatch.ExpressionGroup.MainExpression != null && nextCatch.ExpressionGroup.MainExpression.Tokens != null && nextCatch.ExpressionGroup.MainExpression.Tokens.Count > 0 ? nextCatch. ExpressionGroup. MainExpression. Tokens. FirstOrDefault(i => i.TokenType != TokenType.BRACKET_BEGIN) : null; currentState.CurrentLineID = nextCatch.ID; if (variableForException != null && !String.IsNullOrEmpty(variableForException.TokenName)) { currentState.Object[variableForException.TokenName] = exception; } break; } else { ExitCurrentContext( PainContext); if (PainContext.IsFinished) { break; } } } else { ExitCurrentContext( PainContext); if (PainContext.IsFinished) { break; } } } return(false); }